我想知道做之间是否有任何区别:
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()返回一个文件对象,但是如何在一行中运行所有代码也会自动关闭文件?
使用with语句是首选方式:
with open(filename, 'w') as f:
f.write("Hello world!")
Run Code Online (Sandbox Code Playgroud)
它将确保文件对象在with块外部关闭.
让我举例说明为什么如果初始化close()方法,第一个实例将不起作用.这将有助于您在Python中学习面向对象编程
运行时open(filename, 'w'),它将初始化并返回文件句柄对象.
当您调用时open(filename, 'w').write('helloworld'),您正在调用您启动的文件对象上的write方法.由于write方法不返回任何值/对象,因此var1在上面的代码中将是NoneType
现在在第二个示例中,您将文件对象存储为var1.
var1将有write方法,以及该close方法,因此它会工作.
这与您在第一个示例中所做的相反.
falsetru提供了一个很好的例子,说明如何使用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声明会自动为您完成.在try和finally声明到位,以确保如果在for循环中提出的任何厚望/错误,该文件将被关闭.
来源:Python内置文档
使用with语句,f.close()将在完成后自动调用.https://docs.python.org/2/tutorial/inputoutput.html
愉快地冒险进入python
欢呼,biobirdman
| 归档时间: |
|
| 查看次数: |
138 次 |
| 最近记录: |