Comme @ S.Lott le dit, vous devriez ouvrir vos fichiers en mode «rb», pas en mode «rU». Cependant, cela ne cause peut-être PAS votre problème actuel. Pour autant que je sache, l'utilisation du mode «rU» vous dérangerait s'il y avait \r
des données intégrées, mais ne causerait pas d'autres drames. Je note également que vous avez plusieurs fichiers (tous ouverts avec 'rU' ??) mais qu'un seul cause un problème.
Si le module csv indique que vous avez un octet "NULL" (message idiot, devrait être "NUL") dans votre fichier, alors vous devez vérifier ce qu'il y a dans votre fichier. Je vous suggère de le faire même si l'utilisation de «rb» fait disparaître le problème.
repr()
est (ou veut être) votre ami de débogage. Il montrera sans ambiguïté ce que vous avez, de manière indépendante de la plate-forme (ce qui est utile aux assistants qui ne savent pas ce qui od
est ou fait). Faites ceci:
print repr(open('my.csv', 'rb').read(200)) # dump 1st 200 bytes of file
et copiez / collez soigneusement (ne retapez pas) le résultat dans une édition de votre question (pas dans un commentaire).
Notez également que si le fichier est vraiment douteux, par exemple non \ r ou \ n à une distance raisonnable du début du fichier, le numéro de ligne indiqué par reader.line_num
sera (inutile) 1. Trouvez où se trouve le premier \x00
(le cas échéant) en faisant
data = open('my.csv', 'rb').read()
print data.find('\x00')
et assurez-vous de vider au moins autant d'octets avec repr ou od.
Que data.count('\x00')
vous dit-il? S'il y en a beaucoup, vous pouvez faire quelque chose comme
for i, c in enumerate(data):
if c == '\x00':
print i, repr(data[i-30:i]) + ' *NUL* ' + repr(data[i+1:i+31])
afin que vous puissiez voir les octets NUL dans leur contexte.
Si vous pouvez voir \x00
dans la sortie (ou \0
dans votre od -c
sortie), alors vous avez certainement des octets NUL dans le fichier, et vous devrez faire quelque chose comme ceci:
fi = open('my.csv', 'rb')
data = fi.read()
fi.close()
fo = open('mynew.csv', 'wb')
fo.write(data.replace('\x00', ''))
fo.close()
Au fait, avez-vous regardé le fichier (y compris les dernières lignes) avec un éditeur de texte? Cela ressemble-t-il réellement à un fichier CSV raisonnable comme les autres fichiers (pas d'exception "NULL byte")?
od -c
la première ligne?