Python:没有csv.close()?

2024-09-28 21:05:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用CSV模块读取一个制表符分隔的文件。代码如下:

z = csv.reader(open('/home/rv/ncbi-blast-2.2.23+/db/output.blast'), delimiter='\t')

但当我将Z.close()添加到脚本末尾时,我得到并错误地声明“csv.reader”对象没有属性“close”

z.close()

我该怎么关闭“Z”?


Tags: 模块文件csv代码homecloseoutputdb
3条回答

您不应该直接关闭CSV读卡器;而是应该关闭正在使用的任何类似文件的对象。例如,在你的案例中,你会说:

f = open('/home/rv/ncbi-blast-2.2.23+/db/output.blast')
z = csv.reader(f, delimiter='\t')
...
f.close()

如果您使用的是最新版本的Python,则可以使用with语句,例如

with open('/home/rv/ncbi-blast-2.2.23+/db/output.blast') as f:
    z = csv.reader(f, delimiter='\t')
    ...

这样做的好处是,即使在with块中抛出异常或以其他方式返回,f也将被关闭,而这样的情况将导致在前面的示例中文件保持打开状态。换句话说,它基本上等同于try/finally块,例如

f = open('/home/rv/ncbi-blast-2.2.23+/db/output.blast')
try:
    z = csv.reader(f, delimiter='\t')
    ...
finally:
    f.close()

读者实际上只是一个解析器。当您向它请求一行数据时,它将读取操作委托给底层的file对象,并将结果转换为一组字段。所以没有必要关闭阅读器,这将是一个毫无意义的操作。

不过,您应该确保关闭底层的file对象。在Python2.5+中,可以这样做:

with open('/home/rv/ncbi-blast-2.2.23+/db/output.blast') as f:
    z = csv.reader(f, delimiter='\t')

如果您不熟悉^{} statement,它基本上将其内容封装在try...finally块中,该块关闭finally部分中的文件。对于Python 2.5,需要一个__future__导入来启用with语句。如果您需要保持与早期版本的Python(如2.4)的兼容性,那么您应该使用try...finally关闭自己。


感谢Jared指出了with语句的兼容性问题。

您不关闭reader()方法的结果,而是关闭open()方法的结果。所以,使用两个语句:foo=open(...); bar=csv.reader(foo)。然后你可以打电话给foo.close()

在一行中完成两行中更具可读性和功能性的任务不会获得额外的积分。

相关问题 更多 >