[python] lecture csv :line contains NULL byte

cedric1989 Messages postés 261 Date d'inscription   Statut Membre Dernière intervention   -  
sebsauvage Messages postés 32893 Date d'inscription   Statut Modérateur Dernière intervention   -
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

sebsauvage Messages postés 32893 Date d'inscription   Statut Modérateur Dernière intervention   15 662
 
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
sebsauvage Messages postés 32893 Date d'inscription   Statut Modérateur Dernière intervention   15 662
 
Difficile à dire sans le fichier: tu pourrais m'envoyer une copie du fichier (ou une partie) qui fait planter le code ?
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
csv c'est du texte, est ce que l'ouvrir avec open(fileName,"r") sans le b pour binaire change quelque chose ?
0
cedric1989 Messages postés 261 Date d'inscription   Statut Membre Dernière intervention   37
 
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
affiche juste les lignes 4, 5 et 6, peut-être que le fichier contient un \0, zéro binaire
0
sebsauvage Messages postés 32893 Date d'inscription   Statut Modérateur Dernière intervention   15 662
 
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.
0
cedric1989 Messages postés 261 Date d'inscription   Statut Membre Dernière intervention   37
 
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 ?
0
sebsauvage Messages postés 32893 Date d'inscription   Statut Modérateur Dernière intervention   15 662
 
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.
0
cedric1989 Messages postés 261 Date d'inscription   Statut Membre Dernière intervention   37
 
C'est bon, ça fonctionne en remplacant tout les \0
Merci beaucoup de m'avoir aidé.
0
sebsauvage Messages postés 32893 Date d'inscription   Statut Modérateur Dernière intervention   15 662
 
De rien :-)
0