Je travaille avec des fichiers CSV, avec le code suivant:
reader = csv.reader(open(filepath, "rU"))
try:
for row in reader:
print 'Row read successfully!', row
except csv.Error, e:
sys.exit('file %s, line %d: %s' % (filename, reader.line_num, e))
Et un fichier lève cette erreur:
file my.csv, line 1: line contains NULL byte
Que puis-je faire? Google semble suggérer qu'il peut s'agir d'un fichier Excel qui n'a pas été correctement enregistré au format .csv. Y a-t-il un moyen de contourner ce problème en Python?
== MISE À JOUR ==
Suite au commentaire de @ JohnMachin ci-dessous, j'ai essayé d'ajouter ces lignes à mon script:
print repr(open(filepath, 'rb').read(200)) # dump 1st 200 bytes of file
data = open(filepath, 'rb').read()
print data.find('\x00')
print data.count('\x00')
Et voici le résultat que j'ai obtenu:
'\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1\x00\x00\x00\x00\x00\x00\x00\x00\ .... <snip>
8
13834
Le fichier contient donc effectivement des octets NUL.
od -c
la première ligne?Réponses:
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 quiod
est ou fait). Faites ceci: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 faisantet 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 commeafin que vous puissiez voir les octets NUL dans leur contexte.
Si vous pouvez voir
\x00
dans la sortie (ou\0
dans votreod -c
sortie), alors vous avez certainement des octets NUL dans le fichier, et vous devrez faire quelque chose comme ceci: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")?
la source
'\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1
est la "signature" désignant un fichier de document composé OLE2 - par exemple un fichier Excel 97-2003 .XLS . Je trouve que "dans un éditeur de texte, cela ressemble à un fichier CSV parfaitement raisonnable" est tout à fait incroyable . Vous devez avoir consulté un fichier différent, un fichier CSV valide, dans un autre dossier ou sur une autre machine ou à un autre moment. Notez que votreod
sortie ne provient pas d'un fichier XLS.csv.reader
directement.fo.write(data.replace('\x00', ''))
êtrefo.write(data.replace(b'\x00', b''))
? Python 3.6 here ...Cela fonctionne pour moi.
la source
Le lire comme UTF-16 était aussi mon problème.
Voici mon code qui a fini par fonctionner:
Où emplacement est le répertoire de votre fichier csv.
la source
Je suis tombé sur ce problème aussi. En utilisant le
csv
module Python , j'essayais de lire un fichier XLS créé dans MS Excel et de rencontrer l'NULL byte
erreur que vous obteniez. J'ai regardé autour de moi et j'ai trouvé le module xlrd Python pour lire et formater des données à partir de fichiers de feuille de calcul MS Excel. Avec lexlrd
module, je suis non seulement capable de lire correctement le fichier, mais je peux également accéder à de nombreuses parties différentes du fichier d'une manière que je ne pouvais pas auparavant.J'ai pensé que ça pourrait t'aider.
la source
La conversion de l'encodage du fichier source de UTF-16 en UTF-8 résout mon problème.
Comment convertir un fichier en utf-8 en Python?
la source
Vous pouvez simplement insérer un générateur pour filtrer les valeurs nulles si vous voulez faire semblant qu'elles n'existent pas. Bien sûr, cela suppose que les octets nuls ne font pas vraiment partie de l'encodage et sont vraiment une sorte d'artefact ou de bogue erroné.
la source
Pourquoi fais-tu ça?
Les documents sont assez clairs sur le fait que vous devez le faire:
Le mode doit être "rb" pour lire.
http://docs.python.org/library/csv.html#csv.reader
la source
od
ou le regarde dans un éditeur de texte, il ressemble à un fichier CSV parfaitement normal. Cependant, quand il vide les premiers octets avec Python repr (), cela ressemble à un fichier Excel .XLS (qui a été renommé pour avoir une extension CSV).apparemment c'est un fichier XLS et non un fichier CSV comme http://www.garykessler.net/library/file_sigs.html confirme
la source
Au lieu du lecteur csv, j'utilise un fichier de lecture et une fonction de fractionnement pour la chaîne:
la source
J'ai eu la même erreur. Enregistré le fichier en UTF-8 et cela a fonctionné.
la source
Cela m'est arrivé lorsque j'ai créé un fichier CSV avec OpenOffice Calc. Cela ne s'est pas produit lorsque j'ai créé le fichier CSV dans mon éditeur de texte, même si je l'ai modifié plus tard avec Calc.
J'ai résolu mon problème en copiant-collant dans mon éditeur de texte les données de mon fichier créé par Calc dans un nouveau fichier créé par l'éditeur.
la source
J'ai eu le même problème lors de l'ouverture d'un CSV produit à partir d'un webservice qui insérait des octets NULL dans des en-têtes vides. J'ai fait ce qui suit pour nettoyer le fichier:
Clause de non-responsabilité: sachez que cela écrase vos données d'origine. Assurez-vous d'en avoir une copie de sauvegarde. Tu étais prévenu!
la source
Pour tous ces haters du mode de fichier `` rU '': j'ai juste essayé d'ouvrir un fichier CSV à partir d'une machine Windows sur un Mac avec le mode de fichier `` rb '' et j'ai eu cette erreur du module csv:
L'ouverture du fichier en mode «rU» fonctionne correctement. J'adore le mode universel-nouvelle ligne - cela me permet d'économiser beaucoup de tracas.
la source
J'ai rencontré cela lors de l'utilisation de scrapy et de la récupération d'un fichier csv compressé sans avoir un middleware correct pour décompresser le corps de la réponse avant de le remettre au csvreader. Par conséquent, le fichier n'était pas vraiment un fichier csv et a renvoyé l'
line contains NULL byte
erreur en conséquence.la source
Avez-vous essayé d'utiliser gzip.open?
J'essayais d'ouvrir un fichier qui avait été compressé mais qui avait l'extension «.csv» au lieu de «csv.gz». Cette erreur a continué à apparaître jusqu'à ce que j'utilise gzip.open
la source
Un cas est que - Si le fichier CSV contient des lignes vides, cette erreur peut apparaître. Vérifier la ligne est nécessaire avant de procéder à l'écriture ou à la lecture.
J'ai résolu mon problème en ajoutant cette vérification dans le code.
la source