Python:没有csv.close()?

Har*_*pal 48 python csv

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

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

但是当我将Z.close()添加到我的脚本结尾时,我得到并且错误声明"csv.reader'对象没有属性'close'"

z.close()
Run Code Online (Sandbox Code Playgroud)

那我怎么关闭"Z"?

Dav*_*d Z 51

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

但是,您应该确保关闭基础file对象.在Python 2.5+中,以下是这样做的方法:

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

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


感谢Jared指出该with声明的兼容性问题.


Eli*_*ght 30

您不直接关闭CSV阅读器; 相反,你应该关闭正在使用的任何类文件对象.例如,在您的情况下,您会说:

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

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

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

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

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


Bry*_*ley 6

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

在一行中完成可以更具可读性和功能性的两行没有奖励积分。