Próbuję napisać program, który przegląda plik .CSV (input.csv) i przepisuje tylko te wiersze, które zaczynają się od określonego elementu (corrected.csv), zgodnie z listą w pliku tekstowym (output.txt).
Tak wygląda teraz mój program:
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)
Niestety ciągle otrzymuję ten błąd i nie mam pojęcia, o co chodzi.
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
Podziękowania dla wszystkich ludzi tutaj, którzy nawet doprowadzili mnie do tego punktu.
for row in reader
pętli.open('input.csv').read().index('\0')
jeśli to zrobisz, poda ci offset pierwszego.Odpowiedzi:
Rozwiązałem podobny problem z łatwiejszym rozwiązaniem:
import codecs csvReader = csv.reader(codecs.open('file.csv', 'rU', 'utf-16'))
Kluczem było użycie modułu kodeków do otwarcia pliku z kodowaniem UTF-16, kodowań jest dużo więcej, sprawdź dokumentację .
źródło
csv.reader()
, nie będzie w stanie go obsłużyć, aUnicodeEncodeError
zamiast tego otrzymasz s.UnicodeError: UTF-16 stream does not start with BOM
'utf-16le'
.Domyślam się, że masz bajt NUL w pliku input.csv. Możesz to sprawdzić za pomocą
if '\0' in open('input.csv').read(): print "you have null bytes in your input file" else: print "you don't"
Jeśli zrobisz,
reader = csv.reader(x.replace('\0', '') for x in mycsv)
może cię obejść. Może też oznaczać, że masz utf16 lub coś „interesującego” w pliku .csv.
źródło
file input.csv
aby zidentyfikować typ pliku?reader = csv.reader(mycsv, delimiter='\t')
. Wyobrażam sobie, że czytnik csv pożera cały twój plik, szukając przecinków i docierając do EOF. Ale na pewno masz problem z kodowaniem. Podczas otwierania pliku musisz określić kodowanie.Jeśli chcesz zastąpić wartości null czymś, możesz to zrobić:
def fix_nulls(s): for line in s: yield line.replace('\0', ' ') r = csv.reader(fix_nulls(open(...)))
źródło
Możesz po prostu wbudować generator, aby odfiltrować wartości null, jeśli chcesz udawać, że nie istnieją. Oczywiście zakłada się, że bajty zerowe nie są tak naprawdę częścią kodowania i naprawdę są jakimś błędnym artefaktem lub błędem.
Zobacz
(line.replace('\0','') for line in f)
poniżej, również prawdopodobnie będziesz chciał otworzyć ten plik w trybierb
.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)
źródło
Dzięki temu dowiesz się, w której linii występuje problem.
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
Być może to z daniweb byłoby pomocne:
...
źródło
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])
ÿþ/
<To wszystko, co byTrudny sposób:
Jeśli rozwiniesz się pod Lunuxem, możesz wykorzystać całą moc seda :
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)
Najbardziej wydajne rozwiązanie dla dużych plików.
Sprawdzono pod kątem Python3, Kubuntu
źródło
Niedawno rozwiązałem ten problem iw moim przypadku był to skompresowany plik, który próbowałem odczytać. Najpierw sprawdź format pliku. Następnie sprawdź, czy zawartość jest tym, do czego odnosi się rozszerzenie.
źródło
Przekształcenie mojego środowiska linux w czyste, kompletne środowisko UTF-8 zrobiło dla mnie sztuczkę. Spróbuj wykonać następujące czynności w wierszu poleceń:
export LC_ALL=en_US.UTF-8 export LANG=en_US.UTF-8 export LANGUAGE=en_US.UTF-8
źródło
To już dawno rozwiązane, ale natknąłem się na tę odpowiedź, ponieważ napotkałem nieoczekiwany błąd podczas odczytu pliku CSV w celu przetworzenia jako dane treningowe w Keras i TensorFlow.
W moim przypadku sprawa była dużo prostsza i warto mieć tego świadomość. Dane generowane w pliku CSV nie były spójne, co spowodowało całkowity brak niektórych kolumn, co wydaje się powodować również ten błąd.
Lekcja: jeśli widzisz ten błąd, sprawdź, czy dane wyglądają tak, jak myślisz!
źródło
pandas.read_csv obsługuje teraz różne kodowanie UTF podczas odczytu / zapisu i dlatego może obsługiwać bezpośrednio bajty zerowe
data = pd.read_csv(file, encoding='utf-16')
zobacz https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html
źródło