2013-03-14 2 views
0

파일의 첫 줄을 csv 파일로 읽기 전에 먼저 확인하는 방법을 찾고 있습니다. 나는 # coding: xxx 라인이 있는지 확인하여 그에 따라 데이터를 디코딩 할 수 있습니다. 그러나 그러한 행이 없으면 첫 번째 행에 이미 데이터 세트가 포함되어있을 수 있습니다. 찾는 것은 내게 너무 잔인한 것처럼 보였습니다. 나는 그것을 할 수있는 깔끔한 방법을 기대했습니다.읽기 전에 파일의 첫 번째 줄을 확인하는 방법 CSV

import re 
import csv 
fl = open(filename) 
line = fl.readline() 
coding = re.match('^#\s*coding\s*(:|=|:=)\s*([\w\d\-_]+)\s*$', line) 
fl.seek(0) 

reader = csv.reader(fl) 
# ... 
+0

무엇을 찾기에 "너무 잔인합니다"? –

+0

@ThomasOrozco : 결국 건너 뛸 수있는 또 다른 I/O 호출입니다. –

답변

3

나는 현재의 접근 방식과 아무 잘못 표시되지 않습니다, 그러나 여기 당신이 바람직 찾을 수있는 대안이다 :

import re 
import csv 
import itertools 

line = next(f1) 
coding = re.match('^#\s*coding\s*(:|=|:=)\s*([\w\d\-_]+)\s*$', line) 
reader = csv.reader(itertools.chain([line], f1)) 

그것은 당신의 질문 또는 게시 된 코드에서 명확하지 않다가 하지만 정규식을 사용하면 다음을 수행 할 수 일치하는 경우 첫 번째 라인을 포함하지 않는 경우 :

reader = csv.reader(f1 if coding else itertools.chain([line], f1)) 
+0

그건 좋은거야! 나는 어떤 반복문도'csv.reader' 클래스에 전달할 수 있다는 것을 몰랐습니다. –

+2

일반적으로'.readline()'과 파일에 대한 반복자 액세스를 섞지 마십시오 (버퍼링으로 인해 데이터가 손실 될 수 있습니다). 대신'line = next (f1)'을 사용하십시오. – jfs

+0

고마워, 대신'next (f1)'을 사용하는 대답을 편집했다. –

0

는 첫 번째 라인은 지금과 같이겠습니까? , 당신은 단지 첫 번째 라인을 읽을 수없는 경우

# coding: xxx, some other "field", and maybe another field 

, 더 쉼표 코딩을 해석하는 시도 발견되지 않는 경우 다른, 쉼표를 찾아 csv.reader()에 (그리고 다른 모든 라인) 통과?

관련 문제