Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python“;加上;语句语法_Python_With Statement - Fatal编程技术网

Python“;加上;语句语法

Python“;加上;语句语法,python,with-statement,Python,With Statement,我有一些python代码来解析csv文件。现在,我们的供应商决定将数据文件更改为gzip csv文件。我想知道我必须做的最小/最干净的代码更改是什么。当前功能: def load_data(fname, cols=()): ... ... with open(fname) as f: reader = csv.DictReader(f) ... ... 我不想复制加载_data2()的代码,并将with语句更改为,我认为它工作得很好 with

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

def load_data(fname, cols=()):
    ... ...
    with open(fname) as f:
        reader = csv.DictReader(f)
        ... ... 
我不想复制加载_data2()的代码,并将with语句更改为,我认为它工作得很好

with gzip.open(fname) as f:
我怎样才能算出这句话

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

根据文件名的属性,您可以通过将要用于打开文件的函数指定给不同的变量来完成此操作:

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

通用方法是动态选择一个
开瓶器

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

这样,你就可以在需要的时候毫不费力地添加更多的开场白。下面是另一个示例。

您甚至可以在
with
语句中直接执行此操作:
with gzip.open(fname),如果fname.endswith('.csv.gz'),则使用fname作为f打开(fname)
谢谢,python很漂亮!