Python没有明显的原因停止写入文件

Python没有明显的原因停止写入文件,python,file,Python,File,这真的很奇怪。 我有一个文件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

这真的很奇怪。 我有一个文件
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   

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

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

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

你也可以这样做

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

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

你能把文件上传到某个地方吗?你可以在这里下载:你的代码对我来说非常有用。文件系统是否有足够的空间?是否确定classes.txt文件包含所有6593行?我肯定有足够的空间。是的,生成的
classes.txt
文件包含6593行。我猜您的特定操作系统对文件IO的实现意味着在调用
flush
close
之前,文件不会完全写入磁盘。这是一个性能的东西;IO一直保存在内存中,直到一个大小合适的数据块可以写入磁盘,这是一个昂贵而缓慢的操作,在大数据块中效果最好。我的假设是这是一个缓冲问题。您写入文件的所有内容都是通过缓冲区写入的,在确定缓冲区已满之前不会在文件中结束(不完全正确,但您可以这样想)。在处理文件时,您确实应该使用
with
-语句来处理
文件。close
-自动调用。这似乎并不奇怪,在未关闭的文件中广泛观察到这种行为,并尝试使用
with。。。作为…
构造。