write reading example dictreader python csv

reading - python csv writer example



"La lĂ­nea contiene un byte NULL" en el lector de CSV(Python) (8)

Estoy intentando escribir un programa que mira un archivo .CSV (input.csv) y reescribe solo las filas que comienzan con un elemento determinado (corrected.csv), como se enumera en un archivo de texto (output.txt).

Así es como se ve mi programa en este momento:

import csv lines = [] with open(''output.txt'',''r'') as f: for line in f.readlines(): lines.append(line[:-1]) with open(''corrected.csv'',''w'') as correct: writer = csv.writer(correct, dialect = ''excel'') with open(''input.csv'', ''r'') as mycsv: reader = csv.reader(mycsv) for row in reader: if row[0] not in lines: writer.writerow(row)

Lamentablemente, sigo recibiendo este error y no tengo ni idea de qué se trata.

Traceback (most recent call last): File "C:/Python32/Sample Program/csvParser.py", line 12, in <module> for row in reader: _csv.Error: line contains NULL byte

Le doy mi crédito a toda la gente here incluso para que llegue a este punto.


Convertir mi entorno Linux en un entorno UTF-8 completo y limpio me hizo el truco. Pruebe lo siguiente en su línea de comando:

export LC_ALL=en_US.UTF-8 export LANG=en_US.UTF-8 export LANGUAGE=en_US.UTF-8


Esto te dirá qué línea es el problema.

import csv lines = [] with open(''output.txt'',''r'') as f: for line in f.readlines(): lines.append(line[:-1]) with open(''corrected.csv'',''w'') as correct: writer = csv.writer(correct, dialect = ''excel'') with open(''input.csv'', ''r'') as mycsv: reader = csv.reader(mycsv) try: for i, row in enumerate(reader): if row[0] not in lines: writer.writerow(row) except csv.Error: print(''csv choked on line %s'' % (i+1)) raise

Quizás this de daniweb sería útil:

Obtengo este error al leer desde un archivo csv: "Runtime Error! Line contains NULL byte". ¿Alguna idea sobre la causa raíz de este error?

...

Ok, lo tengo y pensé en publicar la solución. Simplemente me causó pesar ... El archivo usado se guardó en formato .xls en lugar de .csv. No lo capté porque el nombre del archivo en sí tenía la extensión .csv mientras el tipo todavía estaba .xls


He resuelto un problema similar con una solución más fácil:

import codecs csvReader = csv.reader(codecs.open(''file.csv'', ''rU'', ''utf-16''))

La clave era usar el módulo de códecs para abrir el archivo con la codificación UTF-16, hay muchas más codificaciones, verifique la documentation .


Podría alinear un generador para filtrar los valores nulos si quiere fingir que no existen. Por supuesto, esto es asumiendo que los bytes nulos no son realmente parte de la codificación y realmente son algún tipo de error o artefacto erróneo.

Ver el (line.replace(''/0'','''') for line in f) continuación, también querrá probablemente abrir ese archivo usando el modo rb .

import csv lines = [] with open(''output.txt'',''r'') as f: for line in f.readlines(): lines.append(line[:-1]) with open(''corrected.csv'',''w'') as correct: writer = csv.writer(correct, dialect = ''excel'') with open(''input.csv'', ''rb'') as mycsv: reader = csv.reader( (line.replace(''/0'','''') for line in mycsv) ) for row in reader: if row[0] not in lines: writer.writerow(row)


Recientemente solucioné este problema y, en mi caso, era un archivo comprimido que intentaba leer. Verifique el formato de archivo primero. Luego verifique que los contenidos son a lo que se refiere la extensión.


Si desea reemplazar los nulos con algo, puede hacer esto:

def fix_nulls(s): for line in s: yield line.replace(''/0'', '' '') r = csv.reader(fix_nulls(open(...)))


Supongo que tienes un byte NUL en input.csv. Puedes probar eso con

if ''/0'' in open(''input.csv'').read(): print "you have null bytes in your input file" else: print "you don''t"

si lo haces,

reader = csv.reader(x.replace(''/0'', '''') for x in mycsv)

puede ayudarte a superar eso O puede indicar que tiene utf16 o algo "interesante" en el archivo .csv.


Una manera complicada:

Si se desarrolla bajo Lunux, puede usar todo el poder de sed :

from subprocess import check_call, CalledProcessError PATH_TO_FILE = ''/home/user/some/path/to/file.csv'' try: check_call("sed -i -e ''s|//x0||g'' {}".format(PATH_TO_FILE), shell=True) except CalledProcessError as err: print(err)

La solución más eficiente para archivos grandes

Comprobado para Python3, Kubuntu