Problemi con Picton CSV DictReader / Writer
Domanda
Sto cercando di estrarre un mucchio di righe da un file CSV e scriverle in un altro, ma sto riscontrando alcuni problemi.
import csv
f = open("my_csv_file.csv", "r")
r = csv.DictReader(f, delimiter=',')
fieldnames = r.fieldnames
target = open("united.csv", 'w')
w = csv.DictWriter(united, fieldnames=fieldnames)
while True:
try:
row = r.next()
if r.line_num <= 2: #first two rows don't matter
continue
else:
w.writerow(row)
except StopIteration:
break
f.close()
target.close()
In esecuzione, ottengo il seguente errore:
Traceback (most recent call last):
File "unify.py", line 16, in <module>
w.writerow(row)
File "C:\Program Files\Python25\lib\csv.py", line 12
return self.writer.writerow(self._dict_to_list(row
File "C:\Program Files\Python25\lib\csv.py", line 12
if k not in self.fieldnames:
TypeError: argument of type 'NoneType' is not iterable
Non sono del tutto sicuro di cosa sbaglio.
Soluzione
Neanche io lo so, ma dal momento che tutto ciò che stai facendo è copiare le righe da un file a un altro, perché ti preoccupi del materiale csv
? Perché non qualcosa del genere:
f = open("my_csv_file.csv", "r")
target = open("united.csv", 'w')
f.readline()
f.readline()
for line in f:
target.write(line)
Altri suggerimenti
Per chiarire la confusione sull'errore: lo ottieni perché r.fieldnames
è impostato solo una volta letto dal file di input per la prima volta usando r
. Quindi il modo in cui l'hai scritto, fieldnames
sarà sempre inizializzato su None
.
Puoi inizializzare w = csv.DictWriter (uniti, fieldnames = fieldnames)
con r.fieldnames
solo dopo aver letto la prima riga da r
, il che significa che dovresti ristrutturare il tuo codice.
Questo comportamento è documentato nella Documentazione della libreria standard di Python
Gli oggetti DictReader hanno il seguente attributo pubblico:
csvreader.fieldnames
Se non viene passato come parametro durante la creazione dell'oggetto, questo attributo viene inizializzato al primo accesso o quando il primo record viene letto dal file.
Per quanto riguarda l'eccezione, assomiglia a questa riga:
w = csv.DictWriter(united, fieldnames=fieldnames)
dovrebbe essere
w = csv.DictWriter(target, fieldnames=fieldnames)
Il motivo per cui stai ricevendo l'errore è molto probabile che il tuo file CSV originale (my_csv_file.csv) non abbia una riga di intestazione. Pertanto, quando si costruisce l'oggetto reader, il campo fieldnames viene impostato su None
.
Quando si tenta di scrivere una riga utilizzando il writer, si verifica innanzitutto che non siano presenti chiavi nel dict che non siano nell'elenco dei campi noti. Poiché fieldnames
è impostato su None
, un tentativo di determinare il nome della chiave genera un'eccezione.