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)
您可以通过将要使用的函数分配给另一个变量来执行此操作,具体取决于文件名的属性:
opener = gzip.open if fname.endswith('.csv.gz') else open
with opener(fname) as f:
... # code to parse
Run Code Online (Sandbox Code Playgroud)
通用方法是动态选择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)
这样,您可以在需要时无痛地添加更多开场白.这是工厂方法设计模式的另一个例子.