105 votes

"La ligne contient un octet NULL" dans le lecteur de CSV (Python)

Je suis en train d'essayer d'écrire un programme qui regarde un fichier .CSV (input.csv) et réécrit uniquement les lignes qui commencent par un certain élément (corrected.csv), tel que listé dans un fichier texte (output.txt).

Voici à quoi ressemble mon programme actuellement :

import csv

lines = []
with open('output.txt','r') as f:
    for line in f.readlines():
        lines.append(line[:-1])

with open('corrected.csv','w') as correct:
    writer = csv.writer(correct, dialect = 'excel')
    with open('input.csv', 'r') as mycsv:
        reader = csv.reader(mycsv)
        for row in reader:
            if row[0] not in lines:
                writer.writerow(row)

Malheureusement, je continue à obtenir cette erreur, et je n'ai aucune idée de ce qu'il s'agit.

Traceback (most recent call last):
  File "C:\Python32\Sample Program\csvParser.py", line 12, in 
    for row in reader:
_csv.Error: line contains NULL byte

Crédit à toutes les personnes ici qui m'ont même permis d'arriver à ce point.

4voto

masterlk Points 31
    def fix_nulls(s):
        for line in s:
        yield line.replace('\0', '')

    with open(csv_file, 'r', encoding = "utf-8") as f:
        reader = csv.reader(fix_nulls(f))
        for line in reader:
            #do something

ce chemin fonctionne pour moi

3voto

SergO Points 116

Une façon intelligente:

Si vous développez sous Lunux, vous pouvez utiliser toute la puissance de sed:

from subprocess import check_call, CalledProcessError

PATH_TO_FILE = '/home/user/some/path/to/file.csv'

try:
    check_call("sed -i -e 's|\\x0||g' {}".format(PATH_TO_FILE), shell=True)
except CalledProcessError as err:
    print(err)    

La solution la plus efficace pour les fichiers volumineux.

Vérifié pour Python3, Kubuntu

2voto

user1640954 Points 21

Pour sauter les lignes avec des octets NULL

import csv

with open('sample.csv', newline='') as csv_file:
    reader = csv.reader(csv_file)
    while True:
        try:
            row = next(reader)
            print(row)
        except csv.Error:
            continue
        except StopIteration:
            break

1voto

Daniel Lee Points 2517

J'ai récemment résolu ce problème et dans mon cas, c'était un fichier compressé que j'essayais de lire. Vérifiez d'abord le format du fichier. Ensuite, vérifiez que le contenu correspond à ce que l'extension indique.

1voto

Philippe Oger Points 459

Transformer mon environnement linux en un environnement UTF-8 complet et propre a fonctionné pour moi. Essayez ce qui suit dans votre ligne de commande :

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X