2010-02-11 18 views
8

J'ai besoin de lire un fichier CSV en python. Depuis la dernière ligne, je reçois une erreur "octet nul" que je voudrais éviter d'utiliser pour le mot-clé mais le temps.lire le fichier csv sans pour

Savez-vous comment faire?

 
    reader = csv.reader(file) 
    for row in reader # I have an error at this line 
      # do whatever with row 

Je veux remplacer la boucle for avec une boucle while pour que je puisse vérifier si la ligne est NULL ou non.

Quelle est la fonction de lecture d'une seule ligne dans le module CSV? Merci

Merci

P.S. dessous du retraçage

 
Traceback (most recent call last): 
    File "FetchNeuro_TodayTrades.py", line 189, in 
    for row in reader: 
_csv.Error: line contains NULL byte 
+1

J'ai jamais eu un problème avec une boucle. S'il vous plaît ajouter le code réel, plus le retraçage, afin que nous puissions dire ce que vous faites vraiment. –

+0

Je peux confirmer que le lecteur s'étouffe sur un octet NULL écrit dans le fichier sous la forme chr (0). Retraçage (le plus récent appel dernier): Fichier « script.py », ligne 11, dans pour la ligne dans le lecteur: _csv.Error: ligne contient octet NULL – telliott99

+0

@telliott: Il n'y a pas une telle chose comme un octet NULL. –

Répondre

14

Peut-être que vous pourriez attraper l'exception soulevée par le lecteur CSV. Quelque chose comme ceci:

filename = "my.csv" 
reader = csv.reader(open(filename)) 
try: 
    for row in reader: 
     print 'Row read with success!', row 
except csv.Error, e: 
    sys.exit('file %s, line %d: %s' % (filename, reader.line_num, e)) 

Ou vous pouvez utiliser next():

while True: 
    try: 
     print reader.next() 
    except csv.Error: 
     print "Error" 
    except StopIteration: 
     print "Iteration End" 
     break 
+0

Salut Pedro! Super! C'est ce que je cherchais! AFG –

+1

Vous ne pouvez pas attraper cette exception (le tester). – telliott99

+0

@Pedro: Ce que @ telliott99 signifie (si je le canalise correctement) est que vous devez faire 'import _csv' puis' sauf _csv.Error: ' –

0

pas vraiment sûr de ce que vous voulez dire, mais vous pouvez toujours vérifier l'existence avec si

>>> reader = csv.reader("file") 
>>> for r in reader: 
... if r: print r 
... 

si ce n'est pas ce que vous voulez, vous devez décrire votre problème plus clairement en montrant exemples de choses qui ne fonctionnent pas pour vous, y compris le format de fichier d'échantillon et la sortie désirée que vous voulez.

1

La communauté Django a résolu les problèmes d'importation de Python CSV, il est donc possible qu'elle vaille searching for CSV import ou qu'elle pose une question. En outre, vous pouvez modifier la ligne incriminée directement dans le fichier CSV avant d'essayer l'importation.

1

Si votre problème est spécifique à la dernière ligne étant vide, vous pouvez utiliser numpy.genfromtxt (ou l'ancien matplotlib.mlab. csv2rec)

$: cat >csv_file.txt 
foo,bar,baz 
yes,no,0 
x,y,z 



$: 
$: ipython 
>>> from numpy import genfromtxt 
>>> genfromtxt("csv_file.txt", dtype=None, delimiter=',') 
array([['foo', 'bar', 'baz'], 
     ['yes', 'no', '0'], 
     ['x', 'y', 'z']], 
     dtype='|S3') 
3

Vous devez (toujours) dire EXACTEMENT quel est le message d'erreur que vous avez reçu. S'il vous plaît modifier votre question.

Probablement ceci:

>>> import csv; csv.reader("\x00").next() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
_csv.Error: line contains NULL byte 
>>> 

Le module csv est pas propre 8 bits; voir the docs: « » « En outre, il y a actuellement quelques problèmes concernant les caractères NUL ASCII. » « »

Le message d'erreur lui-même est dans l'erreur: il doit être « NUL », pas « NULL » :-(

Si la dernière ligne du fichier est vide, vous n'obtiendrez pas d'exception, vous obtiendrez simplement row == []

En supposant que le problème est un ou plusieurs NUL dans vos fichiers, vous devrez (1) parlez sincèrement au (x) créateur (s) de votre (vos) fichier (s) (2) à défaut, lisez tout le fichier (mode = "rb"), dépouillez le NUL et alimentez fixed_text.splitlines() au csv lecteur.

+0

Salut! Vous avez raison! Par souci de clarté, j'ai ajouté ma question au Traceback. J'ai résolu à la fin avec un essai/excepté le solutoin –

0

Je n'ai pas de réponse, mais je peux confirmer le problème et que la plupart des réponses postées ne fonctionnent pas. Vous ne pouvez pas attraper cette exception. Vous ne pouvez pas tester pour if line. Peut-être que vous pourriez vérifier l'octet NULL directement, mais je ne suis pas assez rapide pour le faire ... Si c'est toujours sur la dernière ligne, vous pouvez bien sûr passer cette étape.

import csv 
FH = open('data.csv','wb') 
line1 = [97,44,98,44,99,10] 
line2 = [100,44,101,44,102,10] 
for n in line1 + line2: 
    FH.write(chr(n)) 
FH.write(chr(0)) 
FH.close() 
FH = open('data.csv') 
reader = csv.reader(FH) 
for line in reader: 
    if '\0' in line: continue 
    if not line: continue 
    print line 

$ python script.py 
['a', 'b', 'c'] 
['d', 'e', 'f'] 
Traceback (most recent call last): 
    File "script.py", line 11, in <module> 
    for line in reader: 
_csv.Error: line contains NULL byte 
+0

Salut! J'ai essayé l'approche simple d'essayer/sauf. Dans mon cas c'était facile et bon car j'ai une erreur sur la dernière ligne d'un fichier CSV où il n'y a pas de données valides. J'espère que cette aide –

1

Vous pouvez essayer de nettoyer le fichier que vous avez bien lu:

def nonull(stream): 
    for line in stream: 
     yield line.replace('\x00', '') 

f = open(filename) 
reader = csv.reader(nonull(f)) 

En supposant, bien sûr, que tout simplement ignorer les caractères NULL vont travailler pour vous!

+0

@John Fouhy: Sans test, je ne me fierais pas à cette approche si les champs avaient des retours à la ligne incorporés, EN PARTICULIER car vous n'assuriez pas le mode binaire ('rb'). –

+0

Un bon point, même si j'imagine que beaucoup de logiciels s'étranglent sur les fichiers CSV avec des nouvelles lignes intégrées à l'intérieur des champs .. –

+0

cela a fonctionné pour moi. Je n'avais pas d'autre choix. – Eric

0

Traitez le fichier csv initial et remplacez le Nul '\0' par un espace vide, puis vous pouvez le lire. Le code actuel ressemble à ceci:

data_initial = open(csv_file, "rU") 
reader = csv.reader((line.replace('\0','') for line in data_initial)) 

Il fonctionne pour moi.

Et la réponse originale est ici: csv-contain null byte

Questions connexes