Python:没有csv.close()?

Python:没有csv.close()?,python,csv,Python,Csv,我正在使用CSV模块读取以制表符分隔的文件。代码如下: z = csv.reader(open('/home/rv/ncbi-blast-2.2.23+/db/output.blast'), delimiter='\t') 但当我将Z.close()添加到脚本的末尾时,我得到了一个错误,声明“csv.reader”对象没有属性“close” 那么如何关闭“Z”?您不能直接关闭CSV读卡器;相反,您应该关闭正在使用的任何类似文件的对象。例如,在你的情况下,你会说: f = open('/home

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

z = csv.reader(open('/home/rv/ncbi-blast-2.2.23+/db/output.blast'), delimiter='\t')
但当我将Z.close()添加到脚本的末尾时,我得到了一个错误,声明“csv.reader”对象没有属性“close”


那么如何关闭“Z”?

您不能直接关闭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()

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

不过,您应该确保关闭底层的
文件
对象。在Python 2.5+中,以下是实现此目的的方法:

with open('/home/rv/ncbi-blast-2.2.23+/db/output.blast') as f:
    z = csv.reader(f, delimiter='\t')
如果您不熟悉,它基本上将其内容封装在一个
try…finally
块中,该块将关闭
finally
部分中的文件。对于Python2.5,您将需要一个
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
导入来启用
with
语句。如果您需要保持与Python早期版本(如2.4)的兼容性,您应该使用
try…finally
来完成关闭操作



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

如果不关闭
reader()
方法的结果,则关闭
open()
方法的结果。因此,使用两个语句:
foo=open(…);bar=csv.reader(foo)
。然后可以调用
foo.close()

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

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