我应该使用哪种方法来访问文件?为什么?

ATO*_*TOA 2 python file

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

方法1:

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

fp = open("hello.txt", "r")
print fp.read()
fp.close()
Run Code Online (Sandbox Code Playgroud)

方法2:

open("hello.txt", "w").write("hello world!")
print open("hello.txt", "r").read()
Run Code Online (Sandbox Code Playgroud)

方法3:

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

with open("hello.txt") as f:
    print f.read()
Run Code Online (Sandbox Code Playgroud)

使用这些中的每一个都有特定的优势吗?

我知道的东西:

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

Kat*_*iel 10

你应该使用第三种方法.

在编程中有一个共同的模式,在哪里使用你设置的一些对象,运行你的代码,然后再把它拆掉.文件句柄就是一个例子:您必须打开文件,运行代码,然后关闭文件.这最后一个不是可选的 - 操作系统知道你已经完成了它,并且Python要从IO缓冲区中清除所有数据,这一点很重要.

现在,CPython是一种引用计数语言.这意味着它计算了多少代码"了解"给定对象,因此当该计数变为零时,它可以清理所述对象并在内存中重用其空间.在方法2中,文件对象的引用计数变为零,这允许Python清理它.文件对象的清理方法也会关闭它们.但是,您通常不应该依赖于此 - 引用计数是Python标准版本的实现细节,并且无法保证您运行程序所使用的任何内容都将执行相同的操作.这就是你不应该使用方法2的原因.

方法1是更好,因为你明确地关闭文件-只要你到达.close()函数调用!如果在该代码块的中间抛出异常,则close不会到达,并且不会显式关闭该文件.所以你应该将中间代码包装在一个try... finally块中.

因此,最好的方法3:您使用with的语句-封闭的惯用方式.close在一个finally块-关闭文件,所以你不必担心额外的语法绒毛try... except.