Pregunta

Estoy intentando extraer un montón de líneas de un archivo CSV y escribirlas en otro, pero tengo algunos problemas.

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()

Al ejecutar esto, obtengo el siguiente error:

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

No estoy completamente seguro de lo que estoy haciendo mal.

¿Fue útil?

Solución

Yo tampoco lo sé, pero dado que todo lo que estás haciendo es copiar líneas de un archivo a otro, ¿por qué te molestas con las cosas de csv ? ¿Por qué no algo como:

f = open("my_csv_file.csv", "r")
target = open("united.csv", 'w')

f.readline()
f.readline()
for line in f:
    target.write(line)

Otros consejos

Para aclarar la confusión sobre el error: lo obtiene porque r.fieldnames solo se configura una vez que lee el archivo de entrada por primera vez con r . De ahí la forma en que lo escribió, fieldnames siempre se inicializará en None .

Puede inicializar w = csv.DictWriter (united, fieldnames = fieldnames) con r.fieldnames solo después de leer la primera línea de r , lo que significa que tendría que reestructurar su código.

Este comportamiento está documentado en la documentación de la biblioteca estándar de Python

  

Los objetos DictReader tienen el siguiente atributo público:

     

csvreader.fieldnames

     

Si no se pasa como parámetro al crear el objeto, este atributo se inicializa al primer acceso o cuando se lee el primer registro del archivo.

En cuanto a la excepción, se ve así:

w = csv.DictWriter(united, fieldnames=fieldnames)

debería ser

w = csv.DictWriter(target, fieldnames=fieldnames)

La razón por la que obtiene el error es muy probable que su archivo CSV original (my_csv_file.csv) no tenga una fila de encabezado. Por lo tanto, cuando construye el objeto lector, su campo de nombres de campo se establece en Ninguno .

Cuando intenta escribir una fila usando el escritor, primero verifica para asegurarse de que no haya claves en el dict que no estén en su lista de campos conocidos. Dado que fieldnames está configurado en None , un intento de desreferenciar el nombre de la clave arroja una excepción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top