Python无故停止向文件写入数据

3

这真的很奇怪。 我有一个名为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行完美运行,但出现问题的原因不明,就在那儿停了。剩下1131行(5463-6593)的数字在classes.txt文件中不存在。我将被跳过的行复制并粘贴到另一个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   

值得一提的是,我已经更改了脚本以将行打印到控制台,并且它做得很好。问题似乎出在将这些行写入文件上。非常感谢任何帮助。


你能把文件上传到某个地方吗? - falsetru
你可以在这里下载:http://d.pr/f/qxUk - StumpedCoder
你的代码对我来说完美无缺。文件系统有足够的空间吗? - falsetru
你确定你的classes.txt文件有6593行吗?我肯定有足够的空间。 - StumpedCoder
是的,生成的 classes.txt 文件包含了6593行。 - falsetru
风格注意:这里调用list(line.rsplit(':',1)[1])[0]是完全没有必要的。只需使用line.rsplit(':', 1)[1][0]即可。 - Bakuriu
3个回答

6

我发现了问题所在!我仍然不确定为什么这样做可以解决问题(以及为什么问题特别出现在第5462行),但我在脚本的结尾处添加了final.close(),然后它无缺地写入了所有6593个数字。很奇怪。


1
我猜测你所使用的操作系统在文件IO方面的实现意味着只有在调用flushclose之后,文件才会完全写入磁盘。这是出于性能考虑;IO会一直保留在内存中,直到可以写入足够大的块到磁盘上,这是一个昂贵而缓慢的操作,并且最好一次性处理大块数据。 - Morgan Harris
5
我的假设是这是一个缓冲问题。你写入文件的所有内容都通过缓冲区写入,直到确定该缓冲区已满(并非完全正确,但可以这样想)才会出现在文件中。在处理文件时,您应该真正使用 with 语句,它会自动处理 file.close 调用。 - msvalkon
4
这种行为并不奇怪,当文件没有关闭时,这种情况很常见。在这里可以查看相关信息,并尝试使用 with ... as ... 结构。 - rook

1

我也可以确认,foo.close()或close()都可以解决这个问题。


0

你也可以这样做

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')

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接