正确的写文件方式?

时间:2014-12-09 03:28:50

标签: python

我想知道在做之间是否有任何区别:

var1 = open(filename, 'w').write("Hello world!")

并且正在做:

var1 = open(filename, 'w')
var1.write("Hello world!")
var1.close()

如果我在使用第一种方法(全部在一行中)后尝试运行AttributeError,我发现没有必要(close())。

我想知道一种方式是否真的有任何不同/更好的'比起另一个,其次,Python在这里做了什么?我知道open()会返回一个文件对象,但是如何在一行中运行所有代码也会自动关闭文件?

3 个答案:

答案 0 :(得分:7)

首选使用with statement

with open(filename, 'w') as f:
    f.write("Hello world!")

它将确保文件对象在with块之外关闭。

答案 1 :(得分:5)

让我举例说明如果初始化close()方法,为什么第一个实例不会工作。这将有助于您未来在Python中学习面向对象的编程

示例1

运行open(filename, 'w')时,它将初始化并返回文件句柄对象。

当您调用open(filename, 'w').write('helloworld')时,您正在调用您启动的文件对象上的write方法。由于write方法不返回任何值/对象,因此上面代码中的var1将为NoneType

示例2

现在,在第二个示例中,您将文件对象存储为var1

var1将采用write方法以及close方法,因此可以使用。

这与你在第一个例子中所做的相反。

falsetru提供了一个很好的例子,说明如何使用with语句

来读写文件

使用with语句

读取和写入文件

with open(filename, 'w') as f:
    f.write("helloworld") 

阅读

with open(filename) as f:
    for line in f:
         ## do your stuff here

使用嵌套语句一次读/写多个文件

您好,这是对您的评论问题的更新。不太确定这是否是最pythonic的方式。但是,如果您希望使用with语句同时使用with语句读/写多个文件。你可以做的就是将声明嵌套在另一个

例如:

with open('a.txt', 'r') as a:
    with open('b.txt', 'w') as b:
        for line in a:
            b.write(line)

如何以及为何

文件对象本身是一个迭代器。因此,您可以使用for循环通过文件进行迭代。文件对象包含next()方法,每次迭代都将被调用,直到到达文件末尾。

with语句是在python 2.5中引入的。在python 2.5之前实现相同的效果,一个必须

f = open("hello.txt")
try:
    for line in f:
        print line,
finally:
    f.close()

现在with语句会自动为您执行此操作。 tryfinally语句用于确保在for循环中是否存在任何期望/错误,文件将被关闭。

来源:Python Built-in Documentation

官方文件

使用with语句,f.close()将在完成后自动调用。 https://docs.python.org/2/tutorial/inputoutput.html

快乐进入python

欢呼声, biobirdman

答案 2 :(得分:2)

@fattru的答案是正确的,就告诉你如何"假设"打开文件。但是你也问过你尝试过的两种方法之间的区别,以及他们为什么要这样做。

问题的这些部分的答案是,第一种方法并没有做你认为它做的事情。以下代码

var1 = open(filename, 'w').write("Hello world!")

大致相当于

tmp = open(filename, 'w')
var1 = tmp.write("Hello world!")
del tmp

请注意,open()函数返回一个文件对象,该文件对象具有write()方法。但write()没有任何返回值,因此var1最终为None。来自file.write(str)的官方文档:

将字符串写入文件。没有回报价值。由于缓冲,在调用flush()或close()方法之前,字符串实际上可能不会显示在文件中。

现在,您不需要close()的原因是Python的主要实现(在python.org上发现的,也称为CPython)恰好是垃圾收集不再具有的对象引用它们,并且在单行版本中,一旦语句完成,您就不会对文件对象有任何引用。您会发现您的多行版本并不严格需要close(),因为所有引用都将在解释器退出时进行清理。但是,请参阅this question的答案,以获取有关close()的更详细说明以及为什么使用它仍然是一个好主意,除非您使用with代替。 / p>