Python"with"语句语法

fiv*_*nts 7 python with-statement

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

def load_data(fname, cols=()):
    ... ...
    with open(fname) as f:
        reader = csv.DictReader(f)
        ... ... 
Run Code Online (Sandbox Code Playgroud)

我不想将代码复制到load_data2(),并将with语句更改为,认为它完美无缺.

with gzip.open(fname) as f:
Run Code Online (Sandbox Code Playgroud)

如何分析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
Run Code Online (Sandbox Code Playgroud)

mdm*_*dml 8

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

opener = gzip.open if fname.endswith('.csv.gz') else open
with opener(fname) as f:
    ... # code to parse
Run Code Online (Sandbox Code Playgroud)

  • 您甚至可以直接在`with`语句中执行此操作:`with gzip.open(fname)if fname.endswith('.csv.gz')else open(fname)as f` (2认同)

Ale*_*kov 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 ...
Run Code Online (Sandbox Code Playgroud)

这样,您可以在需要时无痛地添加更多开场白.这是工厂方法设计模式的另一个例子.