2017-12-18 2 views
2

Ich versuche, eine Null-Byte Ausnahme in der letzten Zeile einer CSV-Datei zu fangen:Uncatchable Null Byte csv.Error Ausnahme

def Catch(csv_filename): 
    with open(csv_filename,'r+') as File: 
     File_reader = csv.reader(File,delimiter="\t",dialect='excel-tab') 
     a = [] 
     for row in File_reader: 
      try: 
       a.append(row) 
      except csv.Error: 
       return "Error" 

Catch("/../DataLogger.csv") 

aber ein _csv.Error angehoben wird:

Traceback (most recent call last): 
File "/../test.py", line 21, in <module> 
Catch("/../DataLogger.csv") 
File "/../test.py", line 13, in Catch 
for row in File_reader: 
    _csv.Error: line contains NULL byte 

Ich verstehe nicht, warum die Ausnahme nicht mit der Funktion abgefangen wird. Ich benutze Python 3.4

Antwort

2

das ist, weil die Ausnahme auftritt, sobald Ihr Code die for Anweisung erreicht.

Keine Ausnahme kann in der a.append Zeile passieren, die csv Modul macht seine Arbeit in der Iteration der for Schleife.

Sobald Sie wissen, dass das Update ist trivial:

try: 
    for row in File_reader: 
     a.append(row) 
except csv.Error: 
    return "Error" 

beachten Sie, dass eine direkte Umwandlung zu verwenden zur Liste versucht sein könnte: a = list(File_reader) aber da die Ausnahme wäre in der list Umwandlung nehmen, a wouldn‘ t gefüllt werden, was ein Ärgernis, wenn der Beginn der Datei Nutzdaten enthält würden Sie lesen wollen (aber da Sie einen Fehlerstring sind Rückkehr, es scheint nicht hier, um die Materie)

+0

.... danke. Hab das überhaupt nicht gesehen –

1
def Catch(csv_filename): 
    with open(csv_filename,'r+') as File: 
     try: 
      File_reader = csv.reader(File,delimiter="\t",dialect='excel-tab') 
      a = [] 
      for row in File_reader: 
       a.append(row) 
     except csv.Error 
      return "Error" 

Catch("/../DataLogger.csv") 

die das ganze Parsing muss b e inside Try/catch, statt nur a.append.