【问题标题】:When does Python actually write to a file? [duplicate]Python 什么时候真正写入文件? [复制]
【发布时间】:2020-12-21 19:43:08
【问题描述】:

我有一个 python 脚本,它收集用户输入并将它们写入文件。 基本结构是代码遍历图像列表,向用户显示每个图像,通过输入提示用户,并通过循环记录每次迭代的用户输入。在循环中写入很重要,因为文件列表有数千个,我不想因为错误或电源故障或其他原因重新启动。

代码方面,相关部分是:

f=open(outfile,a,newline='')
for i in range(0,numFiles):
    folder = sheet.cell_value(i,22) #get image location from a spreadsheet
    Assess = sheet.cell_value(i,23) #get the current assessment from the spreadsheet
    if len(Assess)==0: #no existing assessment
       impath=os.path.join(folder,'image.png')
       <plt calls to show figure>
       while len(Assess)==0:
           Assess=input('Enter Assessment for row %d:' % i)
       <close figure>
    f.write('%s,'%s\n' % (folder, Assess.upper())) 
f.close()

电子表格已经有前 70 行的数据,所以我第一次得到输入查询是在 i=71 上。我已经通过对input 行的多次调用来运行它,但是当我在记事本中打开文件时(代码仍在运行),我只看到 71 个值是在未输入后发生的写入结果if len(Assess)==0:。我能够让我的手动输入在文件中可见的唯一方法是关闭文件。

为什么文件写入对Assess=input() 写入的处理与Assess=sheet.cell_value() 不同?

除了在 for 循环中打开和关闭文件之外,还有其他方法可以在每次迭代后写入吗?

【问题讨论】:

  • 您的输出正在被缓冲以提高效率。要强制刷新缓冲区,请在需要的地方添加对 f.flush() 的调用。
  • 下面的答案和上面的链接答案似乎没有提到你还需要os.fsync() - 请参阅docs hereThis 解释了实际情况。
  • 即使 Python 写入一个文件,它也不会立即登陆磁盘,因为在文件系统级别的操作系统中进行缓冲。
  • 谢谢,迷路的罗兰·史密斯。我会把它添加到代码中。

标签: python timing write


【解决方案1】:

这是由于没有发生冲洗。想写的时候就用flush()写。此外,with 构造可以帮助您处理文件:

   with open(..) as f:
       f.write...
   
   ... when you leave the with block your file is written and closed for you

【讨论】:

  • Carlos - 我通常使用with 构造,但我认为我看到的文件写入时间问题可能是由于这个原因。我会试试flush()。谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-05-25
  • 2013-10-19
  • 2015-06-04
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多