【问题标题】:Python stops writing to a file for no apparent reasonPython 无缘无故停止写入文件
【发布时间】:2013-08-11 01:05:46
【问题描述】:

这真的很奇怪。 我有一个文件temp.txt,格式如下:

   1        1:1        1:1         *0.9    0      0      0.1    0      0    
   2        1:1        1:1         *1      0      0      0      0      0    
   3        1:1        1:1         *1      0      0      0      0      0    
   4        1:1        2:2      +   0.2   *0.7    0.1    0      0      0    
   5        1:1        1:1         *1      0      0      0      0      0    
   6        1:1        1:1         *0.9    0      0      0.1    0      0    
   7        1:1        1:1         *1      0      0      0      0      0    
   8        1:1        1:1         *1      0      0      0      0      0    
   .        .          .           .       .      .      .      .      .
   .        .          .           .       .      .      .      .      .
   .        .          .           .       .      .      .      .      .
6593        1:1        1:1         *1      0      0      0      0      0    

数字本身的含义并不重要(如果有人好奇,这是 WEKA 的输出)。我想要的是将每行第二个冒号右侧的数字放入单独的文件classes.txt,每个数字一行,如下所示:

1
1
1
2
1
.
.
.

我编写了以下 Python 脚本来完成此操作:

initial = open('temp.txt')
final = open('classes.txt','w')
for line in initial:
    final.write(list(line.rsplit(':',1)[1])[0]+'\n') 

它在前 5462 行中完美运行,但没有明显的原因它停在那里。 classes.txt 中没有剩余 1131 行 (5463 - 6593) 中的数字。我将跳过的行复制并粘贴到单独的 txt 文件中,并在该文件上运行脚本,但生成的 classes.txt 为空。

这个问题真的难倒我,因为我看不到第 5462 行和第 5463 行之间没有明显的区别,如下所示:

5461        1:1        1:1         *1      0      0      0      0      0    
5462        1:1        1:1         *1      0      0      0      0      0    
5463        1:1        4:4      +   0.3    0      0     *0.6    0.1    0    
5464        1:1        1:1         *0.8    0      0      0.2    0      0   

为了记录,我更改了脚本以将行打印到控制台,它做得很好。问题似乎在于将这些行写入文件。任何帮助将不胜感激。

【问题讨论】:

  • 你能把文件上传到某个地方吗?
  • 您可以在这里下载:d.pr/f/qxUk
  • 您的代码非常适合我。文件系统是否有足够的空间?
  • 您确定您的 classes.txt 文件包含所有 6593 行吗?我绝对有足够的空间。
  • 是的,生成的classes.txt文件包含6593行。

标签: python file


【解决方案1】:

你也可以这样做

with open('temp.txt') as initial:
    with open('classes.txt','w') as final:
        for line in initial:
            final.write(list(line.rsplit(':',1)[1])[0]+'\n')

现在您不必担心关闭任何文件。

【讨论】:

    【解决方案2】:

    也可以确认, foo.close() 或者 close() 甚至。确实解决了这个问题..

    【讨论】:

      【解决方案3】:

      我发现了发生了什么!我仍然不能 100% 确定为什么这解决了问题(以及为什么问题专门发生在第 5462 行),但我在脚本末尾添加了final.close(),然后它完美地写入了所有 6593 个数字。奇怪。

      【讨论】:

      • 我猜您的特定操作系统对文件 IO 的实现意味着该文件在您调用 flushclose 之前不会完全写入磁盘。这是表演的事情; IO 一直保存在内存中,直到可以将大小合适的块写入磁盘,这是一项昂贵且缓慢的操作,并且在大块中效果最好。
      • 我的假设是这是一个缓冲问题。您写入文件的所有内容都是通过缓冲区写入的,并且在确定该缓冲区已满之前不会最终进入文件(不完全正确,但您可以这样想)。在处理文件时,你真的应该使用with-statement,它会自动处理file.close-call。
      • 这似乎并不奇怪,这种行为在未关闭文件的情况下广泛观察到,see here 并尝试使用with ... as ... 构造。
      猜你喜欢
      • 2022-01-25
      • 1970-01-01
      • 2015-03-25
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多