是否可以对CSV文件直接使用with
语句?做这样的事情似乎很自然:
import csv
with csv.reader(open("myfile.csv")) as reader:
# do things with reader
但是csv.reader没有提供__enter__
和__exit__
方法,所以这是不起作用的。不过,我可以通过两个步骤来完成:
import csv
with open("myfile.csv") as f:
reader = csv.reader(f)
# do things with reader
这第二种方式是不是理想的方式呢?为什么他们不让csv.reader与with语句直接兼容呢?
发布于 2009-01-14 00:24:42
with
语句的主要用途是对语句中使用的对象进行异常安全清理。with
确保文件被关闭、锁定被释放、上下文被恢复等。
在出现异常的情况下,csv.reader是否有要清理的东西?
我会这么说:
with open("myfile.csv") as f:
for row in csv.reader(f):
# process row
你不需要提交补丁就可以同时使用csv.reader
和with
语句。
import contextlib
关于模块contextlib中函数上下文管理器的帮助
contextmanager(func)
@contextmanager decorator.
典型用法:
@contextmanager
def some_generator(<arguments>):
<setup>
try:
yield <value>
finally:
<cleanup>
这使得:
with some_generator(<arguments>) as <variable>:
<body>
等同于:
<setup>
try:
<variable> = <value>
<body>
finally:
<cleanup>
下面是我如何使用它的一个具体示例:curses_screen。
发布于 2009-01-13 22:45:20
是。第二种方法是正确的。
至于为什么呢?谁知道呢。你说得对,这可能是一个简单的改变。它并不像其他事情那样具有高优先级。
您可以轻松地制作自己的补丁工具包并提交。
发布于 2009-01-14 04:57:07
问题是csv.reader并不能真正管理上下文。它可以接受任何可迭代,而不仅仅是一个文件。因此,它不会在其输入上调用close (顺便说一下,如果它调用了close,您可以使用contextlib.closing)。因此,对csv.reader的上下文支持实际上会做什么并不明显。
https://stackoverflow.com/questions/441130
复制相似问题