Як говорить @ 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 байт")?
od -cперший рядок?