Python 3.x 在附加模式下循环和打开文件时。为什么顺序很重要?

Python 3.x 在附加模式下循环和打开文件时。为什么顺序很重要?,python-3.x,input,while-loop,fwrite,Python 3.x,Input,While Loop,Fwrite,我正在学习“python速成课程”,其中一个练习问题要求我以附加模式打开/创建txt文件“guest_book”,并创建一个while循环,要求用户输入他们的姓名,同时将他们的姓名附加到“guest_book”txt中,并打印他们已登录的信息。我已经编写了以下代码 filename = 'guest_book' with open(filename, 'a') as f: while True: name = input('enter name ') f

我正在学习“python速成课程”,其中一个练习问题要求我以附加模式打开/创建txt文件“guest_book”,并创建一个while循环,要求用户输入他们的姓名,同时将他们的姓名附加到“guest_book”txt中,并打印他们已登录的信息。我已经编写了以下代码

filename = 'guest_book'

with open(filename, 'a') as f:
    while True:
        name = input('enter name ')
        f.write(name + '\n')
        print(f"You have been added to the guest book, {name}")
问题:while循环成功,最终打印也成功,但是当我检查guest_book txt时。它不记录输入的名称。有趣的是,通过简单地切换while循环和open txt命令的顺序,它似乎可以工作,如下所示:

filename = 'guest_book.txt'   

while True:
    with open(filename, 'a') as f:
        name = input('enter name ')
        f.write(name + '\n')
        print(f"You have been added to the guest book, {name}")

这两个代码之间的唯一区别是while循环和“with open”线路的切换顺序。有人能给我解释一下为什么这个订单很重要吗?不管我怎么努力,我似乎都无法理解这背后的逻辑。感谢

看起来问题在于打开的txt文件没有正确关闭,程序以强制方式结束,没有运行关闭代码,或者类似的情况。原因是:

filename = 'guest_book.txt'   

while True:
  with open(filename, 'a') as f:
    name = input('enter name ')
    f.write(name + '\n')
    print(f"You have been added to the guest book, {name}")
之所以有效,是因为您不断关闭和打开文件

如果要关闭文件,建议添加保存函数或退出函数。这将使文件正确关闭并保存自身,有点像这样:

filename = 'guest_book'

with open(filename, 'a') as f:
  while True:
    name = input('enter name ')
    if name == 'exit':
         break
    f.write(name + '\n')
    print(f"You have been added to the guest book, {name}")

看起来问题在于OPPEND txt文件没有正确关闭,程序以强制方式结束,没有运行关闭代码,或者类似的情况。原因是:

filename = 'guest_book.txt'   

while True:
  with open(filename, 'a') as f:
    name = input('enter name ')
    f.write(name + '\n')
    print(f"You have been added to the guest book, {name}")
之所以有效,是因为您不断关闭和打开文件

如果要关闭文件,建议添加保存函数或退出函数。这将使文件正确关闭并保存自身,有点像这样:

filename = 'guest_book'

with open(filename, 'a') as f:
  while True:
    name = input('enter name ')
    if name == 'exit':
         break
    f.write(name + '\n')
    print(f"You have been added to the guest book, {name}")

简短解释

自从你

while True
循环永不结束您对文件的更改从未实际“提交”

详细解释

我们使用

with open(filename, 'a') as f:
    f.write("write something")
而不是

f= open("myfile.txt","w+")
f.write("write something")
f.close() 
这样我们就不必手动关闭文件访问-只有在“f.close()”时,更改才会实际写入本地文件

在代码中,一旦“with”-块结束,close()将在后台调用:

with open(filename, 'a') as f:
    while True:
        name = input('enter name ')
        f.write(name + '\n')
        print(f"You have been added to the guest book, {name}")
# close() would be triggered behind the scenes here
# only after completing ALL statements in your with-block, the changes get saved to the file.
print("We never reach this point...")
由于您的代码永远不会到达该点,因为您有一个“while true循环”,所以文件永远不会关闭,更改也永远不会写入文件

在第二个代码示例中,当with块在循环的一次迭代中开始和结束时,文件在“while true”循环的每次迭代中打开和关闭。这意味着在循环的每次迭代中提交所有更改

编辑

正如已经指出的那样:

f.close()释放文件句柄。它还调用(内部等价物)f.flush()来提交未完成的更改。不过,主要目的是释放文件句柄

因此,您可以关闭整个文件(就像Python在关闭时自动刷新文件一样),也可以在写入后在while循环中调用“f.flush()”,以刷新内部缓冲区,但保持文件句柄打开,以防以后继续写入

下面是您的第一个代码(使用flush)的工作改编:


简短解释

自从你

while True
循环永不结束您对文件的更改从未实际“提交”

详细解释

我们使用

with open(filename, 'a') as f:
    f.write("write something")
而不是

f= open("myfile.txt","w+")
f.write("write something")
f.close() 
这样我们就不必手动关闭文件访问-只有在“f.close()”时,更改才会实际写入本地文件

在代码中,一旦“with”-块结束,close()将在后台调用:

with open(filename, 'a') as f:
    while True:
        name = input('enter name ')
        f.write(name + '\n')
        print(f"You have been added to the guest book, {name}")
# close() would be triggered behind the scenes here
# only after completing ALL statements in your with-block, the changes get saved to the file.
print("We never reach this point...")
由于您的代码永远不会到达该点,因为您有一个“while true循环”,所以文件永远不会关闭,更改也永远不会写入文件

在第二个代码示例中,当with块在循环的一次迭代中开始和结束时,文件在“while true”循环的每次迭代中打开和关闭。这意味着在循环的每次迭代中提交所有更改

编辑

正如已经指出的那样:

f.close()释放文件句柄。它还调用(内部等价物)f.flush()来提交未完成的更改。不过,主要目的是释放文件句柄

因此,您可以关闭整个文件(就像Python在关闭时自动刷新文件一样),也可以在写入后在while循环中调用“f.flush()”,以刷新内部缓冲区,但保持文件句柄打开,以防以后继续写入

下面是您的第一个代码(使用flush)的工作改编:


如何退出您的程序?您什么时候检查
guest\u book.txt
?您知道
while
with
语句的作用吗?如何退出程序?您什么时候检查
guest\u book.txt
?您知道
with
语句的
功能吗?更改甚至在
f.close()
with
块结束之前写入。Python默认有一个缓冲区,但它不是无限的。我的印象是f.close()的全部目的是确保所有更改都被刷新/写入文件。如果Python在此之前写入文件,行为就会变得更加混乱。。。在任何情况下,调用f.close()都将保证您的更改在此时保存到文件。
f.close()
释放文件句柄。它还调用(内部等价物)
f.flush()
,以提交未完成的更改。不过,主要目的是释放文件句柄。如果在每次迭代时默认关闭并刷新文件,刷新的目的是什么@MisterMiyagi或者文件在每次迭代结束时实际上没有关闭?@oldboy对于此答案中的代码,文件在每次迭代后都没有关闭。这里是“在每N个字节之后”,其中N通常是4096或8192–这大约是我的na的300或600行