2017-12-18 19 views
2

내가 CSV 파일의 마지막 줄에 널 (null) 바이트 예외 잡으려고 노력 해요 :catch 할 수없는 널 바이트 csv.Error 예외

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") 

을하지만, _csv.Error가 발생합니다 :

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 

나는 왜 예외가 함수에 걸리지 않았는지 모르겠다. 파이썬을 사용하고 있습니다. 문에 도달하면 예외가 발생하기 때문에 파이썬 3.4

답변

2

이 사용됩니다.

a.append 라인에서 예외는 발생하지 않으며 csv 모듈은 for 루프의 반복 작업을 수행합니다.

수정 프로그램이 사소한 것을 알게되면 :

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

노트 하나가 목록에 직접 변환을 사용하도록 유혹 할 수 있다는 : a = list(File_reader)를하지만 예외가 list 변환에서 일어날 것이기 때문에, a 같으면 ' t은 파일의 시작은 당신이 읽고 싶은 (그러나 오류 문자열을 반환하고 있기 때문에, 여기에 중요하지 않는 것) 유용한 데이터를 포함하는 경우 방해가 될 것이다, 가득

+0

.... 감사합니다. 전혀 보지 못했어요. –

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") 

전체 구문 분석은 b에 있어야합니다. e를 시도/catch 대신 a.append 대신 사용하십시오.