@S. Lott dit, vous devriez être à l'ouverture de vos fichiers dans 'rb', pas 'rU' mode. Cependant qui ne peut PAS être la cause de votre problème actuel. Autant que je sache, à l'aide de 'rU' mode de désordre vous si il y a incorporé \r
dans les données, mais pas causer d'autres drames. Je note également que vous disposez de plusieurs fichiers (tous ouvert avec 'rU' ??) mais un seul à l'origine du problème.
Si le module csv dit que vous avez un "NULL" (stupide message devrait être "NUL") octet dans le fichier, alors vous devez vérifier ce qui se trouve dans votre fichier. Je voudrais vous suggérer de le faire même si l'utilisation de 'rb' rend le problème.
repr()
est (ou se veut) le débogage de votre ami. Il va montrer sans ambiguïté que vous avez, dans une plate-forme indépendante de la mode (ce qui est utile pour les accompagnateurs qui ne savent pas ce qu' od
est ou n'). Faire cela:
print repr(open('my.csv', 'rb').read(200)) # dump 1st 200 bytes of file
et soigneusement copier/coller (ne pas retaper) le résultat dans une édition de votre question (non pas dans un commentaire).
Notez également que si le fichier est vraiment louche par exemple, pas de \r ou \n à une distance raisonnable à partir du début du fichier, le numéro de la ligne signalée par reader.line_num
(unhelpfully) 1. Trouver l'emplacement de la première \x00
est (le cas échéant)
data = open('my.csv', 'rb').read()
print data.find('\x00')
et assurez-vous que vous dump au moins ce nombre d'octets avec les repr ou od.
Qu'est - data.count('\x00')
dites-vous? Si il y a beaucoup, vous voudrez peut-être 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])
de sorte que vous pouvez voir NUL octets dans le contexte.
Si vous pouvez voir \x00
à la sortie (ou \0
votre od -c
sortie), alors vous avez certainement NUL byte(s) dans le fichier, et vous aurez besoin de 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()
En passant, avez-vous regardé le fichier (y compris les dernières lignes) avec un éditeur de texte? Faut-il réellement ressembler à un raisonnable fichier CSV comme les autres (pas de "octet NULL" exception) des fichiers?