Estoy tratando de escribir un programa que busque en un archivo .CSV (input.csv) y reescriba solo las filas que comienzan con un determinado elemento (corrected.csv), como se enumeran 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)
Desafortunadamente, 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
Agradezco a toda la gente que está aquí por haberme llegado a este punto.
for row in reader
ciclo.open('input.csv').read().index('\0')
le dará el desplazamiento del primero si lo hace.Respuestas:
Resolví un problema similar con una solución más sencilla:
import codecs csvReader = csv.reader(codecs.open('file.csv', 'rU', 'utf-16'))
La clave fue usar el módulo de códecs para abrir el archivo con la codificación UTF-16, hay muchas más codificaciones, consulte la documentación .
fuente
csv.reader()
, no podrá manejarlos y obtendráUnicodeEncodeError
s en su lugar.UnicodeError: UTF-16 stream does not start with BOM
'utf-16le'
.Supongo que tiene 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 evitar eso. O puede indicar que tiene utf16 o algo 'interesante' en el archivo .csv.
fuente
file input.csv
para identificar el tipo de archivo?reader = csv.reader(mycsv, delimiter='\t')
. Imagino que el lector de csv está engullendo todo su archivo buscando las comas y llegando hasta EOF. Pero definitivamente tienes un problema de codificación. Debe especificar la codificación al abrir el archivo.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(...)))
fuente
Podría simplemente incorporar un generador para filtrar los valores nulos si desea fingir que no existen. Por supuesto, esto supone que los bytes nulos no son realmente parte de la codificación y realmente son algún tipo de artefacto o error erróneo.
Vea lo
(line.replace('\0','') for line in f)
siguiente, también probablemente querrá abrir ese archivo usando el modorb
.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)
fuente
Esto le 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 esto de daniweb sería útil:
...
fuente
Traceback (most recent call last): File "C:\Python32\Sample Program\csvParser.py", line 17, in <module> print ('csv choked on line %s' % (i+1)) NameError: name 'i' is not defined
print(open('input.csv', 'r').readlines()[0])
ÿþ/
<Eso es todo lo que pegaría (principalmente bloques y números)Una forma complicada:
Si 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 eficaz para archivos de gran tamaño.
Comprobado para Python3, Kubuntu
fuente
Recientemente solucioné este problema y, en mi caso, era un archivo comprimido que estaba tratando de leer. Primero verifique el formato de archivo. Luego verifique que el contenido sea a lo que se refiere la extensión.
fuente
Convertir mi entorno Linux en un entorno UTF-8 completo y limpio fue el truco para mí. Intente 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
fuente
Esto se resolvió hace mucho tiempo, pero encontré esta respuesta porque estaba experimentando un error inesperado mientras leía un CSV para procesar como datos de entrenamiento en Keras y TensorFlow.
En mi caso, la cuestión era mucho más sencilla y merece la pena ser consciente. Los datos que se producían en el CSV no eran consistentes, lo que provocaba que algunas columnas faltaran por completo, lo que parece terminar arrojando este error también.
La lección: si ves este error, verifica que tus datos se vean como crees.
fuente
pandas.read_csv ahora maneja las diferentes codificaciones UTF al leer / escribir y, por lo tanto, puede tratar directamente con bytes nulos
data = pd.read_csv(file, encoding='utf-16')
ver https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html
fuente