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.

Foi útil?

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!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top