Python - ignorare righe in un file
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.
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!