2013-10-28 62 views
7

我有一些解析csv文件的python代码。现在我们的供应商决定将数据文件更改为gzip csv文件。我想知道我必须做的最小/最干净的代码更改是什么。当前功能:Python“与”语句语法

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

我不想重复的代码load_data2(),并与语句来更改,认为它完美的作品。

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

普遍的方法是动态选择一个opener

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 ... 

这样的话,你可以毫不费力在需要时增加更多叹为观止。这里是factory method design pattern的另一个例子。

8

您可以通过指定要使用打开该文件在不同的变量,根据文件名的属性功能做到这一点:

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

你甚至可以直接在'with'语句中做这个:'用gzip.open(fname)if fname.endswith('.csv.gz')else open(fname)as f' – kindall

+0

谢谢,python很漂亮! – fivelements