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

时间:2013-01-11 08:59:32

标签: 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()

方法2:

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

方法3:

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不会为您提供执行多项操作的句柄。

3 个答案:

答案 0 :(得分:10)

您应该使用第三种方法。

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

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

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

方法3因此最好:您使用with语句 - 将.close封闭在finally块中的惯用方法 - 关闭文件,这样您就不会我不得不担心try... except的额外语法松散。

答案 1 :(得分: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.   
  3. w +模式允许对同一文件对象进行读写操作
  4.   
  5. with负责关闭文件
  6.   

答案 2 :(得分:0)

我认为最好采用方法一,因为它是明确的,你可以用tryexcept block或方法3

包围它