CSV

2012-06-08 6 views
1

나는 CSV의 마지막 행을 제거하기 위해 노력하고있어에서 마지막 행을 제거하지만 오류가 점점 :CSV

dcsv = open('PnL.csv' , 'a+r+b') 
cWriter = csv.writer(dcsv, delimiter=' ') 
cReader = csv.reader(dcsv) 
for row in cReader: 
    cWriter.writerow(row[:-1]) 

알아낼 질수 : _csv.Error: string with NUL byte

이것은 내가 지금까지 무엇을 가지고 내가) 오류

+0

아마도 파일에 NUL 바이트가 있습니까? – Thomas

+1

나는 이것이 당신이 원하는 것을 어쨌든 할 것이라고 생각하지 않습니다. 'row [: - 1]'는 마지막 원소가없는 현재 행을 줄 것이다. 마지막 행을 제외한 모든 행을 줄 수는 없습니다. 즉, 마지막 행이 아닌 마지막 _column_을 제거합니다. – octern

+0

또한 스크립트의 어느 줄에서 오류가 발생합니까? – octern

답변

6

난 그냥 readlines 메쏘드 (로 전체 파일을 읽을 것이다가 계속 왜, 마지막 행을 튀어 다음 CSV 모듈이 쓰기

import csv 
f = open("summary.csv", "r+w") 
lines=f.readlines() 
lines=lines[:-1] 

cWriter = csv.writer(f, delimiter=',') 
for line in lines: 
    cWriter.writerow(line) 
+0

마지막 CSV 줄에 줄 바꿈이있는 인용 된 필드가 있으면 논리 줄이 여러 줄로 확장 될 수 있습니다. – huon

0

'a + r + b'파일 모드로 무엇을하고 있는지, 동일한 파일을 읽고 쓰고 있는지 확실하지 않으므로 전체 코드 스 니펫을 제공하지는 않지만 간단하게 건너 뛸 수있는 방법이 있습니다. NUL 바이트를 읽는 파일에있는 NUL 바이트가 들어있는 행. 마지막으로 읽었는지, 처음에 읽혔는지, 읽히는 중 하나에 있든 상관 없습니다.

비결은 워드 프로세서가 csv.writer()에 csvfile 인수 말 것을 깨닫게하는 것입니다 "는 반복자 프로토콜을 지원하며 문자열을 그 next() 메소드가 호출 될 때마다 반환하는 모든 객체가 될 수 있습니다."

def filter_nul_byte_lines(a_file): 
    for line in a_file: 
     if '\x00' not in line: 
      yield line 

이 비슷한 방법으로 그것을 사용 :

dcsv = open('Pnl.csv', 'rb+') 
cReader = csv.reader(filter_nul_byte_lines(dcsv)) 
for row in cReader: 
    print row 

이 어떤 원인이됩니다이 간단한 필터 반복자 함수 호출에 파일 인수를 대체 정의 이런 식으로 할 수 있음을 의미 NUL 바이트가있는 행은 파일을 읽는 동안 무시됩니다. 또한이 기술은 각 행을 읽을 때마다 작동하므로 전체 파일을 한 번에 메모리로 읽거나 미리 처리 할 필요가 없습니다.

관련 문제