2013-02-23 2 views
1

나는 어떤 이유로 든 각 파일의 처음 네 행에 대한 전체 정크 데이터가있는 50-60 개의 csv 파일 배치를 가지고 있습니다. 그러나 정크 데이터 이후에는 열 머리글이 제대로 나열되고 나머지 파일은 정상적으로 처리됩니다. 파이썬으로 처음 네 개 파일의 각 파일을 제거하는 방법은 무엇입니까? 당신이 볼 수 있듯이, 내가 행한 모든 파일을 열어 그 내용을 인쇄파이썬에서 CSV의 처음 네 행을 제거 하시겠습니까?

import csv 
total = open('C:\\Csv\\201.csv', 'rb') 
for row in csv.reader(total): 
    print row 

: 여기에 지금까지 내 코드입니다. 나는 csv 파일의 특정 측면을 삭제하는 해결책을 찾았지만 대부분은 전체 열을 삭제하거나 삭제할 행의 특정 조건에 따라 달라집니다. 필자의 경우, 그것은 단지 순서의 문제이며, 모든 파일은 첫 번째 네 행을 제거해야합니다. 모든 도움이 크게 감사드립니다.

답변

3
for i, line in enumerate(sys.stdin, -4): 
    if i>=0: print line, 
+0

Dang. 견고하고 간결한 코드. 완벽하게 작동합니다. 고맙습니다! – user1067257

4

당신은 할 수 :

reader = csv.reader(total) 
all(next(reader) for i in range(4)) 

또는

for i in range(4): next(reader) 
+0

그것은 창조적입니다. 나는 "any"를 사용하는 것을 결코 생각하지 못했습니다. – user1067257

+3

'any'는 첫 번째 줄만 건너 뛰고,'all'은 네 줄 모두 건너 뜁니다. –

+0

@HaiVu : 물론! 나는 더 많은 관심을 기울일 필요가 있다고 생각한다. –

0

당신은 어떤 순서의 처음 n 항목 건너 일반적인 함수를 작성할 수 있습니다

def skip_first(seq, n): 
    for i,item in enumerate(seq): 
     if i >= n: 
      yield item 

로를 그것을 사용하십시오 :

이 모든 순서를 건너 뛸 수 있기 때문에
import csv 
with open('C:\\Csv\\201.csv', 'rb') as total: 
    csvreader = csv.reader(total) 
    for row in skip_first(csvreader, 4): 
     print row 

이 기능은 일반, 그냥 제출하지 :

# Skip the first three 
list = ['happy', 'grumpy', 'doc', 'sleepy', 'bashful', 'sneezy', 'dopey'] 
for item in skip_first(list, 3): 
    print item 
0

을 나는 아무도 여기 islice를 사용하는 파이썬 방법을 제안하지 않았다 놀랍군요 ...

from itertools import islice 
with open('somefile') as fin: 
    csvin = islice(csv.reader(fin), 4, None, None) 
    for row in csvin: 
     pass 

예 :

>>> r = range(10); list(islice(r, 4, None, None)) 
[4, 5, 6, 7, 8, 9] 
0

N 그 중 하나는 DictReader에 필요한 헤더 행을 고려하는 것 같습니다. 첫 번째 행에 필드 목록 이외의 것이 있으면, DictReader은 해당 행을 인식하고 적절히 구문 분석하지 않습니다.

csv.reader은 파일과 유사한 객체를 예상하므로 임시 버퍼로 StringIO을 사용해야합니다 (심각한 문제는 아니며 일반적으로 약 20 개의 행이 있음).

with StringIO() as csvio: 
    for i, line in enumerate(myfile.iter_lines()): 
     if i < 5: 
      continue 
     else: 
      csvio.write(line) 

    reader = csv.DictReader(csvio) 

에서는 모든 메모리의 경우 버퍼링없이 처음 N을 제외한 모든 라인에 대한 파일 - 류의 객체를 생성하는 더 나은 제안을 감사하겠습니다.

관련 문제