Как говорит @ S.Lott, вы должны открывать свои файлы в режиме «rb», а не в режиме «rU». Однако это может НЕ быть причиной вашей текущей проблемы. Насколько мне известно, использование режима «rU» может вас испортить, если они встроены \rв данные, но не вызовет никаких других проблем. Я также отмечу, что у вас есть несколько файлов (все открыты с помощью 'rU' ??), но только один вызывает проблемы.
Если модуль csv сообщает, что в вашем файле есть байт «NULL» (глупое сообщение, должно быть «NUL»), то вам необходимо проверить, что находится в вашем файле. Я бы посоветовал вам сделать это, даже если использование rb решит проблему.
repr()является (или хочет быть) вашим другом по отладке. Он однозначно покажет, что у вас есть, независимо от платформы (что полезно для помощников, которые не знают, что odесть или делает). Сделай это:
print repr(open('my.csv', 'rb').read(200)) # dump 1st 200 bytes of file
и аккуратно скопируйте / вставьте (не вводите повторно) результат в редактирование вашего вопроса (не в комментарий).
Также обратите внимание, что если файл действительно изворотливый, например, нет \ r или \ n на разумном расстоянии от начала файла, номер строки, сообщаемый с помощью, reader.line_numбудет (бесполезно) 1. Найдите, где находится первое \x00(если есть), выполнив
data = open('my.csv', 'rb').read()
print data.find('\x00')
и убедитесь, что вы сбрасываете по крайней мере это количество байтов с помощью repr или od.
Что data.count('\x00')вам сказать? Если их много, вы можете сделать что-нибудь вроде
for i, c in enumerate(data):
if c == '\x00':
print i, repr(data[i-30:i]) + ' *NUL* ' + repr(data[i+1:i+31])
так что вы можете видеть байты NUL в контексте.
Если вы видите \x00на выходе (или \0на своем od -cвыходе), то у вас определенно есть NUL байт (ы) в файле, и вам нужно будет сделать что-то вроде этого:
fi = open('my.csv', 'rb')
data = fi.read()
fi.close()
fo = open('mynew.csv', 'wb')
fo.write(data.replace('\x00', ''))
fo.close()
Кстати, вы просматривали файл (включая последние несколько строк) в текстовом редакторе? Действительно ли он похож на разумный CSV-файл, как и другие (без исключения "NULL byte") файлы?
od -cговорит первая строка?