ดังที่ @ 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
พูดลักษณะบรรทัดแรกเป็นอย่างไร