Я пытаюсь написать программу, которая просматривает файл .CSV (input.csv) и перезаписывает только те строки, которые начинаются с определенного элемента (corrected.csv), как указано в текстовом файле (output.txt).
Вот как сейчас выглядит моя программа:
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)
К сожалению, я все время получаю эту ошибку и понятия не имею, о чем она.
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
Благодарность всем присутствующим здесь людям даже за то, что они довели меня до этого момента.
for row in reader
цикле.open('input.csv').read().index('\0')
даст вам смещение первого, если вы это сделаете.Ответы:
Я решил аналогичную проблему более простым решением:
import codecs csvReader = csv.reader(codecs.open('file.csv', 'rU', 'utf-16'))
Ключ заключался в использовании модуля кодеков для открытия файла в кодировке UTF-16, кодировок намного больше, проверьте документацию .
источник
csv.reader()
они не смогут их обработать, иUnicodeEncodeError
вместо этого вы получите s.UnicodeError: UTF-16 stream does not start with BOM
'utf-16le'
.Я предполагаю, что у вас есть байт NUL в input.csv. Вы можете проверить это с помощью
if '\0' in open('input.csv').read(): print "you have null bytes in your input file" else: print "you don't"
если да,
reader = csv.reader(x.replace('\0', '') for x in mycsv)
может помочь вам обойти это. Или это может означать, что у вас есть utf16 или что-то «интересное» в файле .csv.
источник
file input.csv
для определения типа файла?reader = csv.reader(mycsv, delimiter='\t')
. Я представляю, что читатель csv пожирает весь ваш файл в поисках запятых и доходит до EOF. Но у вас определенно есть проблема с кодировкой. Вам нужно указать кодировку при открытии файла.Если вы хотите заменить нули чем-то, вы можете сделать это:
def fix_nulls(s): for line in s: yield line.replace('\0', ' ') r = csv.reader(fix_nulls(open(...)))
источник
Вы можете просто встроить генератор для фильтрации нулевых значений, если хотите сделать вид, что их не существует. Конечно, это предполагает, что нулевые байты на самом деле не являются частью кодировки, а действительно представляют собой своего рода ошибочный артефакт или ошибку.
См.
(line.replace('\0','') for line in f)
Ниже, также вы, вероятно, захотите открыть этот файл в режиме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)
источник
Это скажет вам, в какой строке проблема.
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
Возможно, это от daniweb будет полезно:
...
источник
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])
ÿþ/
<Это все, что он вставлял (в основном это блоки и числа)Хитрый способ:
Если вы разрабатываете под Lunux, вы можете использовать все возможности 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)
Наиболее эффективное решение для больших файлов.
Проверено на Python3, Kubuntu
источник
Я недавно исправил эту проблему, и в моем случае это был сжатый файл, который я пытался прочитать. Сначала проверьте формат файла. Затем убедитесь, что содержимое соответствует расширению.
источник
Превращение моей среды Linux в чистую, законченную среду UTF-8 помогло мне. Попробуйте в командной строке следующее:
export LC_ALL=en_US.UTF-8 export LANG=en_US.UTF-8 export LANGUAGE=en_US.UTF-8
источник
Это давно решено, но я столкнулся с этим ответом, потому что у меня возникла неожиданная ошибка при чтении CSV для обработки в качестве обучающих данных в Keras и TensorFlow.
В моем случае проблема была намного проще, и о ней стоит подумать. Данные, создаваемые в CSV, не были согласованными, в результате чего некоторые столбцы полностью отсутствовали, что, похоже, также вызывает эту ошибку.
Урок: если вы видите эту ошибку, убедитесь, что ваши данные выглядят так, как вы думаете!
источник
Все очень просто.
не создавайте CSV-файл с помощью команды «Создать новый Excel» или сохраняйте как «.csv» из окна.
просто импортируйте модуль csv, напишите фиктивный файл csv, а затем вставьте в него свои данные.
csv, созданный самим модулем csv python, больше не будет отображать ошибку кодировки или пустую строку.
источник
pandas.read_csv теперь обрабатывает другую кодировку UTF при чтении / записи и, следовательно, может иметь дело непосредственно с нулевыми байтами
data = pd.read_csv(file, encoding='utf-16')
см. https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html
источник