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。。。作为…
构造。