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.

È stato utile?

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.

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