Python – ignora linhas em um arquivo
Pergunta
Como ignorar linhas em um arquivo?
Exemplo:
Se você sabe que as primeiras linhas de um arquivo começarão, digamos, com a ou b e o restante das linhas terminará com c, como analisar o arquivo de modo que as linhas que começam com a ou b sejam ignoradas e as linhas que terminem com c sejam convertidas em a? lista aninhada?
O que tenho até agora:
fname = raw_input('Enter file name: ')
z = open(fname, 'r')
#I tried this but it converts all lines to a nested list
z_list = [i.strip().split() for i in z]
Eu estou supondo que preciso de um loop for.
for line in z:
if line[0] == 'a':
pass
if line[0] == 'b':
pass
if line[-1] == 'c':
list_1 = [line.strip().split()]
A ideia acima é a ideia geral, mas sou especialista em criar código morto!Como torná-lo morto-vivo?
Obrigado; Seafoid.
Solução
começa com pode levar uma tupla de cordas para combinar, para que você possa fazer isso:
[line.strip().split() for line in z if not line.startswith(('a', 'b'))]
Isso funcionará mesmo que A e B sejam palavras ou frases não apenas personagens. Se houver casos em que as linhas não comecem com A ou B, mas também não terminam com C, você pode estender a compreensão da lista:
[
line.strip().split()
for line in z if line.endswith('c') and not line.startswith(('a', 'b'))
]
Outras dicas
Uma abordagem muito geral é "filtrar" o arquivo removendo algumas linhas:
import itertools
zlist = [l.strip.split() for l in itertools.ifilter(lambda line: line[0] not in 'ab', z)]
Você pode usar itertools.ifilter
Sempre que você deseja "filtrar seletivamente" um iterável, obtendo outro iterável que contém apenas os itens que satisfazem algum predicado - e é por isso que digo que essa abordagem é muito geral. ITERTOOLS Tem muitas ferramentas rápidas e ótimas para lidar com iterables de uma maneira inútil e vale a pena estudar.
Uma abordagem semelhante, mas sintaticamente mais simples, que basta no seu caso (e que, portanto, eu recomendaria devido à virtude da simplicidade), é fazer a "filtragem" com um if
Cláusula na Listcomp:
zlist = [l.strip.split() for l in z if l[0] not in 'ab']
Você pode adicionar if
Condições para listar compreensões.
z_list = [i.strip().split() for i in z if i[-1] == 'c']
ou
z_list = [i.strip().split() for i in z if (i[0] <> 'a' and i[0] <> 'b')]
Uma maneira de fazer isso é substituir 'passe' por 'continuar'. Isso continuará para a próxima linha no arquivo sem fazer nada. Você também precisará anexar a linha para list_1
if line[-1] == 'c':
list_1.append([line.strip().split()])
f=open("file")
for line in f:
li=line.strip()
if not li[0] in ["a","b"] and li[-1]=="c":
print line.rstrip()
f.close()
Para os interessados na solução.
E também, outra pergunta!
Exemplo de formato de arquivo:
c this is a comment
p m 1468 1 267
260 32 0
8 1 0
Código:
fname = raw_input('Please enter the name of file: ')
z = open(fname, 'r')
required_list = [line.strip().split() for line in z if not line.startswith(('c', 'p'))]
print required_list
Saída:
[['260', '32', '0'], ['8', '1', '0']]
Alguma sugestão sobre como converter as strings nas listas em números inteiros e realizar operações aritméticas?
Pseudocódigo para ilustrar:
#for the second item in each sublist
#if sum is > than first number in second line of file
#pass
#else
#abort/raise error
Felicidades pessoal por suas sugestões até agora, Seafoid.
@Nadia, meu dia parece valer um pouco mais a pena agora!Passei horas (até dias) tentando decifrar esse solo!Obrigado!