python – 用于打开具有两个函数的文件的“with”语法
假设我想使用以下语法打开一个文本文件进行阅读: with open(fname,'r') as f: # do something pass 但如果我发现它以.gz结尾,我会调用gzip.open(). if fname.endswith('.gz'): with gzip.open(fname,'rt') as f: # do something pass else: with open(fname,'r') as f: # do something pass 如果“做某事”部分很长并且不方便在函数中写入(例如,它会创建一个无法序列化的嵌套函数),使用gzip.open或基于返回的打开调用的最短方法是什么? fname.endswith( ‘广州’)? 解决方法上下文管理器帮助关闭对象.但是,您不必创建用作上下文管理器的对象,同时使用它来输入上下文. open()和gzip.open()调用返回一个恰好是上下文管理器的新对象,您可以在输入上下文之前创建它们: if fname.endswith('.gz'): f = gzip.open(fname,'rt') else: f = open(fname,'r') with f: # do something 在这两种情况下,对象在进入上下文时返回self,因此这里不需要使用f作为f. 此外,函数是一等公民,因此您还可以使用变量来存储函数,然后在with语句中调用它来创建上下文管理器和文件对象: if fname.endswith('.gz'): opener = gzip.open else: opener = open with opener(fname,'rt') as f: # yes,both open and gzip.open support mode='rt' # do something 这并没有真正为你带来任何其他方法,但你可以使用字典将扩展名映射到callables,如果你愿意的话. 底线是calls context-manager hook methods,没有更少,仅此而已.应用之后的表达式应该提供这样的管理器,但是创建该对象不受上下文管理协议的约束. (编辑:鄂州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- python – Pandas:更改具有多级列的数据框中的特定列名称
- django-forms – 如何使用modelformset_factory创建一个空的
- Django 1.10中有哪些django.core.context_processors.reque
- python – Django – 显示ImageField
- 试图了解python csv .next()
- python – 有效地将numpy数组与元素进行比较
- day10(闭包、import模块、函数命名空间)
- 如何在带有错误栏的条形图中绘制pandas数据帧的特定行和列(
- python argparse – 传递值WITHOUT命令行
- django – 如何在保存之前使用PIL调整新上传的图像大小?