7

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

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
4

2 回答 2

8

您可以通过将要用于打开文件的函数分配给不同的变量来执行此操作,具体取决于文件名的属性:

opener = gzip.open if fname.endswith('.csv.gz') else open
with opener(fname) as f:
    ... # code to parse
于 2013-10-28T15:35:15.530 回答
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 ...

这样,您可以在需要时轻松添加更多开瓶器。这是工厂方法设计模式的另一个例子。

于 2013-10-28T15:43:26.117 回答