[python] lecture csv :line contains NULL byte [Fermé]

Signaler
Messages postés
258
Date d'inscription
samedi 19 avril 2008
Statut
Membre
Dernière intervention
25 octobre 2012
-
Messages postés
32840
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
-
Bonjour,

Je possède une ceintaine de fichier csv, et je dois faire un script permettant d'effectuer rapidement des opération sur ces fichiers.
Le format ressemble à du csv, avec tabulation comme séparateur.
Le problème c'est que quand j'execture le script la :
for line in csv.reader(open(fileName,"rb"), dialect = csv.excel_tab):
    print line

ça ne peut lire que les première lignes, voici ce que ça affiche :
>>>
['ligne1']
['ligne2']
['ligne3']
['ligne4']
[]
Traceback (most recent call last):
File "G:\ecole\ArcelorMittal\projets\projet02(dataPilote)\script perso\scriptPy.py", line 17, in <module>
for line in csv.reader(open(fileName2,"rb"), dialect = csv.excel_tab):
Error: line contains NULL byte

Au début je pensait que ce n'était pas vraiment du csv, donc je l'ai ouvert avec excel, et enregistré en csv, mais le problème était toujours le même. Quelqu'un sait ce que je pourrai faire ?

Merci d'avance

10 réponses

Messages postés
32840
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 433
c'est pas du vrai csv, ç'est juste que ça ressemble.

Ben alors c'est normal que le module CSV plante, non ?

Ou alors il faudrait faire un pré-traitement avant de le donner à manger au module CSV.

On ne peut pas t'aider tant qu'on ne connaît pas les particularités de ton fichier.
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63550 internautes nous ont dit merci ce mois-ci

Messages postés
32840
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 433
Difficile à dire sans le fichier: tu pourrais m'envoyer une copie du fichier (ou une partie) qui fait planter le code ?
Messages postés
18240
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
30 novembre 2020
5 168
csv c'est du texte, est ce que l'ouvrir avec open(fileName,"r") sans le b pour binaire change quelque chose ?
Messages postés
258
Date d'inscription
samedi 19 avril 2008
Statut
Membre
Dernière intervention
25 octobre 2012
35
Non parce que mon fichier est en binaire, mais c'est pas du vrai csv, ç'est juste que ça ressemble.
Je me suis trompé quand j'ouvre mon fichier avec excel, et que je le converti en csv, la ca fonctionne avec open(fileName,"r"), mais le problème c'est que si je fait ca, je vais devoir ouvrire plus de 100 fichiers avec excel et les reconvertir, c'est assez lourd à faire, le but de mon programme doit tout faire lui même une fois qu'il est lancé et qu'il a récuperé la liste des fichiers.
Par contre quand je l'ouvre avec csv.reader(open(fileName,"rb"), dialect = csv.excel_tab), ça marche jusqu'à arrivé à la ligne qui n'est censé rien contenir.

sebsauvage c'est sympa de vouloir m'aider, mais le problème c'est que j'ai pas l'autorisation d'envoyé mon fichier, sinon je vais voir si je peux pas en faire un du même style qui déclenche le même problème.
Messages postés
18240
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
30 novembre 2020
5 168
affiche juste les lignes 4, 5 et 6, peut-être que le fichier contient un \0, zéro binaire
Messages postés
32840
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 433
Si le fichier contient des octets de valeur zéro, c'est anormal et ça fera planter le module CSV.
On peut faire un peu bourrin et remplacer ces octets de valeur zéro par un espace.
Ensuite, ça coule tout seul dans le module CSV (il y aura juste à filtrer les lignes qui ne t'intéressent pas):

import StringIO,csv

data = open("monfichier.dat","rb").read().replace("\0"," ")
file = StringIO.StringIO(data)

for line in csv.reader(file, dialect = csv.excel_tab):
    print line


Attention: ça charger tout le fichier en mémoire d'un coup. Il faudra donc procéder autrement si le fichier est vraiment gros.
Messages postés
258
Date d'inscription
samedi 19 avril 2008
Statut
Membre
Dernière intervention
25 octobre 2012
35
Oui il y en a un à la ligne 6:
Notepads++ m'affiche :
0NUL
(NUL surligné, et aprés d'autre caractère)
Mais quand je fait copier coller de la ligne, il s'arrête au 0, donc il doit y avec un \0, mais dans ce cas ça veut dire que je pourrai pas lire mon fichier ?
Messages postés
32840
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 433
donc il doit y avec un \0

Il y en a plusieurs.
L'appli qui génère ce CSV est foireuse.


mais dans ce cas ça veut dire que je pourrai pas lire mon fichier ?

Si, avec l'astuce que j'ai donnée.
Messages postés
258
Date d'inscription
samedi 19 avril 2008
Statut
Membre
Dernière intervention
25 octobre 2012
35
C'est bon, ça fonctionne en remplacant tout les \0
Merci beaucoup de m'avoir aidé.
Messages postés
32840
Date d'inscription
mercredi 29 août 2001
Statut
Modérateur
Dernière intervention
21 octobre 2019
15 433
De rien :-)