2013-10-28 2 views
7

나는 csv 파일을 구문 분석하는 파이썬 코드가 있습니다. 이제 우리의 공급 업체는 gzip csv 파일로 데이터 파일을 변경하기로 결정했습니다. 내가해야 할 최소한의/가장 깨끗한 코드 변경이 무엇인지 궁금 해서요. 현재 함수 :Python "with"구문 구문

def load_data(fname, cols=()): 
    ... ... 
    with open(fname) as f: 
     reader = csv.DictReader(f) 
     ... ... 

코드를 load_data2()에 복제하고 with 문을 변경하여 완벽하게 작동한다고 생각하지 마십시오.

with gzip.open(fname) as f: 

with 문을 어떻게 제외 할 수 있습니까?

def load_data(fname, cols=()): 
    ... ... 
    if fname.endswith('.csv.gz'): 
     with gzip.open(fname) as f: 
    else: 
     with open(fname) as f: 

     reader = csv.DictReader(f) 
     ... ... # code to parse 
당신은 파일 이름의 속성에 따라 다른 변수에 파일을 여는 데 사용할 함수를 지정하여이 작업을 수행 할 수 있습니다

답변

6

보편적 인 방법은 동적을하는 것입니다 필요할 때

openers = { 
    'http': urllib2.urlopen, 
    '.csv.gz': gzip.open 
    '.csv': open 
} 

resource_type = get_resource_type(resource) # determine the type of the resource 

with openers[resource_type](resource) as f: 
    # do stuff ... 

그런 식으로, 당신은 고통없이 더 오프너를 추가 할 수 있습니다 opener을 선택합니다. 다음은 factory method design pattern의 또 다른 예입니다.

8

:

opener = gzip.open if fname.endswith('.csv.gz') else open 
with opener(fname) as f: 
    ... # code to parse 
+2

fume.endswith ('. csv.gz')이면 fz로, gzip.open (fname)을 사용하면 f '로도 열 수 있습니다. – kindall

+0

감사합니다. python이 아름답습니다. ! – fivelements