2

我在 python 中,有很多方法可以访问文件。

方法一:

fp = open("hello.txt", "w")
fp.write("No no no");
fp.close()

fp = open("hello.txt", "r")
print fp.read()
fp.close()

方法二:

open("hello.txt", "w").write("hello world!")
print open("hello.txt", "r").read()

方法三:

with open("hello.txt","w") as f:
    f.write("Yes yes yes")

with open("hello.txt") as f:
    print f.read()

使用这些是否有特定的优势?

我知道的东西:

  • 方法 2 和方法 3 会自动关闭文件,但方法 1 不会。
  • 方法 2 没有为您提供执行多项操作的句柄。
4

3 回答 3

10

您应该使用第三种方法。

编程中有一种常见的模式,在哪里使用您设置的某个对象,运行您的代码,然后再次将其拆除。文件句柄就是一个例子:你必须打开文件,运行你的代码,然后关闭文件。最后一个不是可选的——让操作系统知道你已经完成了它,并且让 Python 从它的 IO 缓冲区中刷新所有数据是很重要的。

现在,CPython 是一种引用计数语言。这意味着它会计算“知道”给定对象的代码片段数,以便当计数变为零时,它可以清理所述对象并重用其在内存中的空间。在方法 2 中,文件对象的引用计数变为零,这允许 Python 对其进行清理。并且文件对象的清理方法也会关闭它们。但是,您通常不应该依赖这一点——引用计数是 Python 标准版本的实现细节,并且不能保证您用来运行程序的任何东西都会做同样的事情。这就是为什么你不应该使用方法 2。

方法 1 更好,因为您显式关闭文件——只要您到达.close()函数调用!如果在该代码块的中间抛出异常,则close不会到达,并且不会显式关闭文件。因此,您应该真正将中间代码包装在一个try... finally块中。

因此方法 3 是最好的:您使用语句(将 括在一个块中with的惯用方式)来关闭文件,因此您不必担心..closefinallytry... except

于 2013-01-11T09:08:30.123 回答
1

我会使用这个,一种扩展版本method 3

with open("hello.txt","w+") as f:  
    f.write("Yes yes yes")
    f.seek(0)                  #places the cursor back to the start of the file
    print f.read()             #now read the file

优点:

  1. 它只打开一次文件
  2. w+ 模式允许对同一个文件对象进行读写
  3. with负责关闭文件
于 2013-01-11T09:04:56.343 回答
0

我认为最好采用方法一,因为它是明确的,您可以用tryandexcept block或方法 3包围它

于 2013-01-11T09:09:37.490 回答