正确的写文件方式?

Win*_*ill 2 python

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

var1 = open(filename, 'w').write("Hello world!")
Run Code Online (Sandbox Code Playgroud)

并做:

var1 = open(filename, 'w')
var1.write("Hello world!")
var1.close()
Run Code Online (Sandbox Code Playgroud)

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

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

fal*_*tru 7

使用with语句是首选方式:

with open(filename, 'w') as f:
    f.write("Hello world!")
Run Code Online (Sandbox Code Playgroud)

它将确保文件对象在with块外部关闭.


bio*_*man 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") 
Run Code Online (Sandbox Code Playgroud)

阅读

with open(filename) as f:
    for line in f:
         ## do your stuff here
Run Code Online (Sandbox Code Playgroud)

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

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

例如 :

with open('a.txt', 'r') as a:
    with open('b.txt', 'w') as b:
        for line in a:
            b.write(line)
Run Code Online (Sandbox Code Playgroud)

如何以及为什么

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

with声明是在python 2.5中引入的.在python 2.5之前实现相同的效果,必须要有

f = open("hello.txt")
try:
    for line in f:
        print line,
finally:
    f.close()
Run Code Online (Sandbox Code Playgroud)

现在with声明会自动为您完成.在tryfinally声明到位,以确保如果在for循环中提出的任何厚望/错误,该文件将被关闭.

来源:Python内置文档

官方文件

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

愉快地冒险进入python

欢呼,biobirdman