我正在使用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)
你不是关闭reader()方法的结果,而是关闭方法的结果open()。因此,使用两个语句:foo=open(...); bar=csv.reader(foo). 然后就可以调用了foo.close()。
在一行中完成可以更具可读性和功能性的两行没有奖励积分。
| 归档时间: |
|
| 查看次数: |
75888 次 |
| 最近记录: |