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.

89voto

retracile Points 6301

Je suppose que vous avez un octet NUL dans input.csv. Vous pouvez le tester avec

if '\0' in open('input.csv').read():
    print "vous avez des octets nuls dans votre fichier d'entrée"
else:
    print "vous n'en avez pas"

si c'est le cas,

reader = csv.reader(x.replace('\0', '') for x in mycsv)

peut vous aider à contourner cela. Ou cela peut indiquer que vous avez utf16 ou quelque chose d'« intéressant » dans le fichier .csv.

82voto

K. David C. Points 852

J'ai résolu un problème similaire avec une solution plus facile :

import codecs
csvReader = csv.reader(codecs.open('file.csv', 'rU', 'utf-16'))

La clé était d'utiliser le module codecs pour ouvrir le fichier avec l'encodage UTF-16, il existe de nombreux autres encodages, consultez la documentation.

25voto

Claudiu Points 58398

Si vous souhaitez remplacer les nulls par quelque chose, vous pouvez faire ceci :

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

r = csv.reader(fix_nulls(open(...)))

13voto

woot Points 2407

Vous pourriez simplement intégrer un générateur pour filtrer les valeurs nulles si vous voulez faire comme si elles n'existaient pas. Bien sûr, cela suppose que les octets nuls ne font pas vraiment partie du codage et sont en réalité une sorte d'artefact erroné ou de bug.

Voir le (line.replace('\0','') for line in f) ci-dessous, vous voudrez probablement ouvrir ce fichier en mode rb.

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', 'rb') as mycsv:
        reader = csv.reader( (line.replace('\0','') for line in mycsv) )
        for row in reader:
            if row[0] not in lines:
                writer.writerow(row)

7voto

Steven Rumbalski Points 16838

Cela vous dira sur quelle ligne se situe le problème.

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)
        try:
            for i, row in enumerate(reader):
                if row[0] not in lines:
                   writer.writerow(row)
        except csv.Error:
            print('csv a échoué à la ligne %s' % (i+1))
            raise

Peut-être que ceci de daniweb vous serait utile:

Je reçois cette erreur en lisant d'un fichier csv: "Erreur d'exécution! la ligne contient un octet NULL". Avez-vous une idée de la cause de cette erreur?

...

D'accord, j'ai compris et je pensais poster la solution. Simplement, cela m'a causé des soucis... Le fichier utilisé était enregistré au format .xls au lieu de .csv. Je ne l'ai pas remarqué car le nom du fichier avait l'extension .csv alors que le type était toujours .xls

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