为什么将文本写入文件仅在从终端调用时才有效?

滴滴

我在 Python 中得到了这个简单的代码,它将“abc”写入文本文件调用test.txt. 现在,在 Raspberry 上用 IDLE 或 Thonny 执行此代码不起作用,文本文件保持为空……但是,当使用终端调用时,它将文本写入文件。有人可以帮忙吗?

f = open("test.txt","w") 
f.write("abc")
粘贴

Python 默认缓冲文件写入。它这样做是出于性能目的。每次 Python 写入文件(或操作系统控制的 IO 流,如 STDOUT)时,它都必须暂停执行并将控制权交给操作系统。如果操作系统正忙于执行其他操作,或者您要写入数据的磁盘正忙于执行其他操作,您可能需要等待很长时间才能获得响应。Python 不是每次想写东西时都等待,而是将数据写入内存中的缓冲区,然后承诺在缓冲区填满后最终将缓冲区的内容写入文件(这个过程称为“刷新”缓冲区)。这允许您的程序立即继续执行。

使用写入缓冲区的风险在于,如果您的程序在缓冲区刷新到磁盘之前崩溃,您将丢失该数据。此外,如果一个程序写入缓冲区并以这种方式继续执行,则无法保证并发运行的程序会看到磁盘上的数据,直到第一个程序以某种方式刷新缓冲区。第二种情况是您的示例中发生的情况:IDLE 正在运行一个写入缓冲区的 Python 进程,并且您正在运行第二个并发进程以在 IDLE 仍在运行时检查文件。因为缓冲区没有在 IDLE 中被刷新,所以你不会看到任何写入。从终端运行程序时不会发生这种情况,因为那里的 Python 进程终止了,

有很多方法可以强制刷新缓冲区。Python 在文件关闭时自动刷新写入缓冲区,因此您可以尝试:

f = open("test.txt", "w")
f.write("abc")
f.close()

在 Python 中打开文件的首选方法是使用with语句上下文管理器当执行退出with块时,with语句中创建的变量会被告知自行清理,在文件的情况下,这意味着关闭它们。所以你可以试试:

with open("test.txt", "w") as f:
    f.write("abc")  # after this block, f is flushed and closed

如果要保持文件打开并手动刷新写入缓冲区,Python 为您提供了flush方法,因此您也可以编写:

f = open("test.txt", "w")
f.write("abc")
f.flush()  # f remains open

最后,您可以通过将buffering参数open传递. 0告诉 Python 在每次写入磁盘时立即刷新。所以你可以这样做:

f = open("test.txt", "w", buffering=0)
f.write("abc")  # f remains open

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

JavaScript在使用Node调用时有效,但仅在从HTML调用时才有效

来自分类Dev

Groovy 元编程 (getProperty) 仅在从类外部调用时才有效?

来自分类Dev

Python 线程仅在从另一个模块调用时才有效

来自分类Dev

将文件发送到 blob 仅在 while 循环中调用函数时才有效

来自分类Dev

为什么我的Rails AJAX删除方法仅在刷新后才有效?

来自分类Dev

为什么我的 tkinter 窗口仅在全局创建时才有效?

来自分类Dev

为什么有些程序在从终端调用时返回,而另一些程序仅在包含“&”的情况下返回

来自分类Dev

Javascript 函数仅在其他 javascript 函数被禁用时才有效

来自分类Dev

图像RotateFlip仅在直接调用时有效

来自分类Dev

图像RotateFlip仅在直接调用时有效

来自分类Dev

CSS文本过渡仅在HTML输入具有“ required”标签时才有效

来自分类Dev

无密码登录仅在服务器上使用直接调用的sshd才有效

来自分类Dev

JavaScript元素着色仅在通过document.writeln文本之后才有效

来自分类Dev

仅在不使用数组的情况下,使用IFS循环读取文件才有效

来自分类Dev

Nginx 仅在将工作进程用户设置为 root 时才有效

来自分类Dev

Powershell 脚本仅在存在断点时才有效

来自分类Dev

java 应用程序仅在我不在命令行中包含其“.jar”扩展名时才有效,为什么会这样?

来自分类Dev

为什么NdisFSendNetBufferLists仅在从FilterSendNetBufferLists调用时才起作用?

来自分类Dev

为什么NdisFSendNetBufferLists仅在从FilterSendNetBufferLists调用时才起作用?

来自分类Dev

使用jquery序列化上传多个文件仅在第二次调用时有效

来自分类Dev

从视图观察控制器属性仅在从didInsertElement调用get('controller')时有效

来自分类Dev

为什么powershell命令在终端中有效但在lnk文件中无效?

来自分类Dev

JVM常量池索引值必须大于0才有效,这是为什么?

来自分类Dev

javascript获取文件类型仅在文件名称中包含1个点时才有效

来自分类Dev

pyowm 调用在自己的程序中有效,但在从其他程序调用时无效

来自分类Dev

将字符串写入文件的最有效方式是什么?

来自分类Dev

Xcode(Swift)文档说将属性设置为YES,但仅在设置为true时才有效?

来自分类Dev

将 Kendo Grid 页面大小设置为变量仅在使用 parseInt(Variable) 时才有效?

来自分类Dev

C ++缓冲文本并有条件地将部分写入文本文件的有效方法

Related 相关文章

  1. 1

    JavaScript在使用Node调用时有效,但仅在从HTML调用时才有效

  2. 2

    Groovy 元编程 (getProperty) 仅在从类外部调用时才有效?

  3. 3

    Python 线程仅在从另一个模块调用时才有效

  4. 4

    将文件发送到 blob 仅在 while 循环中调用函数时才有效

  5. 5

    为什么我的Rails AJAX删除方法仅在刷新后才有效?

  6. 6

    为什么我的 tkinter 窗口仅在全局创建时才有效?

  7. 7

    为什么有些程序在从终端调用时返回,而另一些程序仅在包含“&”的情况下返回

  8. 8

    Javascript 函数仅在其他 javascript 函数被禁用时才有效

  9. 9

    图像RotateFlip仅在直接调用时有效

  10. 10

    图像RotateFlip仅在直接调用时有效

  11. 11

    CSS文本过渡仅在HTML输入具有“ required”标签时才有效

  12. 12

    无密码登录仅在服务器上使用直接调用的sshd才有效

  13. 13

    JavaScript元素着色仅在通过document.writeln文本之后才有效

  14. 14

    仅在不使用数组的情况下,使用IFS循环读取文件才有效

  15. 15

    Nginx 仅在将工作进程用户设置为 root 时才有效

  16. 16

    Powershell 脚本仅在存在断点时才有效

  17. 17

    java 应用程序仅在我不在命令行中包含其“.jar”扩展名时才有效,为什么会这样?

  18. 18

    为什么NdisFSendNetBufferLists仅在从FilterSendNetBufferLists调用时才起作用?

  19. 19

    为什么NdisFSendNetBufferLists仅在从FilterSendNetBufferLists调用时才起作用?

  20. 20

    使用jquery序列化上传多个文件仅在第二次调用时有效

  21. 21

    从视图观察控制器属性仅在从didInsertElement调用get('controller')时有效

  22. 22

    为什么powershell命令在终端中有效但在lnk文件中无效?

  23. 23

    JVM常量池索引值必须大于0才有效,这是为什么?

  24. 24

    javascript获取文件类型仅在文件名称中包含1个点时才有效

  25. 25

    pyowm 调用在自己的程序中有效,但在从其他程序调用时无效

  26. 26

    将字符串写入文件的最有效方式是什么?

  27. 27

    Xcode(Swift)文档说将属性设置为YES,但仅在设置为true时才有效?

  28. 28

    将 Kendo Grid 页面大小设置为变量仅在使用 parseInt(Variable) 时才有效?

  29. 29

    C ++缓冲文本并有条件地将部分写入文本文件的有效方法

热门标签

归档