我想知道在做之间是否有任何区别:
var1 = open(filename, 'w').write("Hello world!")
并且正在做:
var1 = open(filename, 'w')
var1.write("Hello world!")
var1.close()
如果我在使用第一种方法(全部在一行中)后尝试运行AttributeError
,我发现没有必要(close()
)。
我想知道一种方式是否真的有任何不同/更好的'比起另一个,其次,Python在这里做了什么?我知道open()
会返回一个文件对象,但是如何在一行中运行所有代码也会自动关闭文件?
答案 0 :(得分:7)
答案 1 :(得分:5)
让我举例说明如果初始化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")
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
语句会自动为您执行此操作。 try
和finally
语句用于确保在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>