Như @ S.Lott nói, bạn nên mở tệp của mình ở chế độ 'rb', không phải chế độ 'rU'. Tuy nhiên điều đó có thể KHÔNG gây ra vấn đề hiện tại của bạn. Theo như tôi biết, việc sử dụng chế độ 'rU' sẽ khiến bạn rối tung lên nếu có \r
dữ liệu được nhúng vào, nhưng không gây ra bất kỳ bộ phim truyền hình nào khác. Tôi cũng lưu ý rằng bạn có một số tệp (tất cả đều được mở bằng 'rU' ??) nhưng chỉ một tệp gây ra sự cố.
Nếu mô-đun csv nói rằng bạn có byte "NULL" (thông báo ngớ ngẩn, phải là "NUL") trong tệp của bạn, thì bạn cần kiểm tra xem có gì trong tệp của mình. Tôi khuyên bạn nên làm điều này ngay cả khi sử dụng 'rb' làm cho vấn đề biến mất.
repr()
là (hoặc muốn trở thành) người bạn gỡ lỗi của bạn. Nó sẽ hiển thị rõ ràng những gì bạn đã có, theo một cách độc lập với nền tảng (điều này rất hữu ích cho những người trợ giúp không biết những gì od
đang làm hoặc đang làm). Làm cái này:
print repr(open('my.csv', 'rb').read(200)) # dump 1st 200 bytes of file
và cẩn thận sao chép / dán (không nhập lại) kết quả vào bản chỉnh sửa câu hỏi của bạn (không phải vào nhận xét).
Cũng lưu ý rằng nếu tệp thực sự khó hiểu, chẳng hạn như không có \ r hoặc \ n trong khoảng cách hợp lý từ đầu tệp, số dòng được báo cáo reader.line_num
sẽ là (vô ích) 1. Tìm vị trí đầu tiên \x00
(nếu có) bằng cách
data = open('my.csv', 'rb').read()
print data.find('\x00')
và đảm bảo rằng bạn kết xuất ít nhất nhiều byte đó với repr hoặc od.
Điều gì data.count('\x00')
cho bạn biết? Nếu có nhiều, bạn có thể muốn làm điều gì đó như
for i, c in enumerate(data):
if c == '\x00':
print i, repr(data[i-30:i]) + ' *NUL* ' + repr(data[i+1:i+31])
để bạn có thể thấy các byte NUL trong ngữ cảnh.
Nếu bạn có thể thấy \x00
trong đầu ra (hoặc \0
trong od -c
đầu ra của bạn ), thì bạn chắc chắn có (các) byte NUL trong tệp và bạn sẽ cần phải làm như sau:
fi = open('my.csv', 'rb')
data = fi.read()
fi.close()
fo = open('mynew.csv', 'wb')
fo.write(data.replace('\x00', ''))
fo.close()
Nhân tiện, bạn đã xem tệp (bao gồm vài dòng cuối cùng) bằng trình soạn thảo văn bản chưa? Nó có thực sự giống một tệp CSV hợp lý giống như các tệp khác (không có ngoại lệ "byte NULL") không?
od -c
nói cái nhìn dòng đầu tiên như thế nào?