Domanda

Come si fa a ignorare righe in un file?

Esempio:

Se si sa che le prime righe di un file inizierà con dire, A o B e il resto delle linee di terminare con c, come si fa analizzare il file in modo che le linee di iniziare a o b vengono ignorati e le linee che terminano c sono convertito in un elenco nidificato?

Quello che ho finora:

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]

Sono indovinando che ho bisogno di un ciclo for.

for line in z:
    if line[0] == 'a':
        pass
    if line[0] == 'b':
        pass
    if line[-1] == 'c':
        list_1 = [line.strip().split()]

È possibile che questo è l'idea generale, ma io sono esperto a fare codice morto! Come si fa a renderlo non morti?

Grazie, Seafoid.

È stato utile?

Soluzione

startswith può prendere una tupla di stringhe per abbinare, in modo da può fare questo:

[line.strip().split() for line in z if not line.startswith(('a', 'b'))]

Ciò funziona anche se a e b sono parole o frasi non solo personaggi. Se ci possono essere casi in cui le linee non si inizia con una o b ma anche non terminare con c è possibile estendere la lista di comprensione a questo:

[
    line.strip().split()
    for line in z if line.endswith('c') and not line.startswith(('a', 'b'))
]

Altri suggerimenti

Un approccio molto generale è quello di "filtrare" il file rimuovendo alcune linee:

import itertools
zlist = [l.strip.split() for l in itertools.ifilter(lambda line: line[0] not in 'ab', z)]

È possibile utilizzare itertools.ifilter ogni volta che si vuole "selettivamente filtrare" un iterabile, ottenendo un altro iterabile che contiene solo gli elementi che soddisfano alcuni predicati - ed è per questo che dico questo approccio è molto generale. itertools ha un sacco di grandi, strumenti veloci per affrontare iterables in modo miriade, e vale la pena di studiare.

Un simile ma sintatticamente semplice approccio, che è sufficiente nel caso (e che quindi lo consiglio dovuta alla virtù della semplicità), è quello di fare il "filtro" con una clausola if nella listcomp:

zlist = [l.strip.split() for l in z if l[0] not in 'ab']

È possibile aggiungere condizioni if elencare comprensioni.

z_list = [i.strip().split() for i in z if i[-1] == 'c']

o

z_list = [i.strip().split() for i in z if (i[0] <> 'a' and i[0] <> 'b')]

Un modo per farlo è quello di sostituire il 'passaggio' con 'continua'. Questo continuerà a quella successiva riga nel file senza fare nulla. Sarà inoltre necessario aggiungere la linea di 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()

Per chi è interessato alla soluzione.

E poi, un'altra domanda!

formato di file Esempio:

c this is a comment
p m 1468 1 267
260 32 0
8 1 0

Codice:

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

Output:

[['260', '32', '0'], ['8', '1', '0']]

Qualche suggerimento su come convertire le stringhe nelle liste di numeri interi ed eseguire operazioni aritmetiche?

Pseudocodice per illustrare:

#for the second item in each sublist
     #if sum is > than first number in second line of file
         #pass
     #else
         #abort/raise error

Alla salute la gente per i vostri suggerimenti finora, Seafoid.

@Nadia, il mio giorno sembra un po 'più utile ora! Ho passato ore (giorni anche), cercando di rompere questo da solo! Grazie!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top