Python:没有csv.close()?

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

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

但是,当我添加Z.close()结束我的脚本我得到和错误,说明“csv.reader”对象没有属性“closures”

 z.close() 

那么我如何closures“Z”?

读者实际上只是一个parsing器。 当你问它一行数据时,它将阅读动作委托给底层file对象,并将结果转换成一组字段。 所以没有必要closures读者。 这将是一个毫无意义的操作。

不过,您应该确保closures底层的file对象。 在Python 2.5+中,这里是这样做的:

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

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


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

您不要直接closuresCSV阅读器。 相反,你应该closures任何类似文件的对象正在使用。 例如,在你的情况下,你会说:

 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') ... 

这具有如下优点:即使抛出exception,或者在with-block内部返回, f也将被closures,而这种情况将导致文件在前面的示例中保持打开状态。 换句话说,它基本上等于try / finally块,例如

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

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

没有奖励积分奖励做在一行可以更可读和function在两个。