为什么我会错过Python中的一些迭代?

时间:2017-04-08 16:32:30

标签: python python-2.7 python-3.x spyder

我在directory1中使用源语言中的25个文件和directory2中的目标语言中的25个文件标记了部分语音(POS)并行语料库。每个文件包含1000行,即每个目录25000行。

手头的任务:我想删除POS标记,然后在单个文本文件中写出源语言和目标语言中的所有文本,例如source.txt& target.txt

幸运的是,我这样做了(参见下面的代码)但是当我运行代码时 - 有时source.txttarget.txt有24896行或24871行等但不是25000.运行代码后2- 3次我获得两个文件的25000行。

Sample POS tagged input: Need\VBN of\IN delivery\NN with\IN operation\NN .\.

这种行为对我来说很神秘(非CS毕业)。 对此行为是否有任何解释,或者就是这样。

请原谅我,如果这是一个愚蠢的问题!

outfile1 = open("source.txt",'w')
outfile2 = open("target.txt",'w')

path = '/somePath/'
file_names = []; tempDataSrc = []; tempDataTrg = []

for root, dirs, files in os.walk(path):
    for file in files:
        if file.endswith('.txt'):
            file_names.append(os.path.join(root, file))

file_names = sorted(file_names)

for file in file_names:  
    if ("Src_" in file): # filtering source language files
        infile1 = open(file,'r')
        for line_s in infile1:
            line_s = " ".join(word.split("\\")[0] for word in line_s.split())
            tempDataSrc.append(line_e)

for file in file_names: 
    if ("Trg_" in file): # filtering target language files
        infile2 = open(file,'r')
        for line_t in infile2:
            line_t = " ".join(word.split("\\")[0] for word in line_t.split())
            tempDataTrg.append(line_p)

for line1 in tempDataSrc:
    outfile1.write(line1+'\n')

for line2 in tempDataTrg:
    outfile2.write(line2+'\n')

注意:我使用python 3.6进行conda安装。我在Spyder IDE中运行我的代码;操作系统:Ubuntu 14.04.5

PS:鼓励以更加pythonic方式编写代码的任何建议

1 个答案:

答案 0 :(得分:3)

我想这个行为与运行程序的环境有关(IDE或你的操作系统本身)正在突然杀死进程,而且还没有完成将输出写入文件 - 因为你没有在代码中关闭我们的输出文件。

您只需在代码的最末端调用“outfile1”和“outfile2”上的.close()方法即可解决此问题。

但是,当你要求以更Pythonic的方式做事时输入:因为你只是在脚本末尾写入输出,所以只有“打开”然后接近代码的那一部分也是有意义的。既然我们在这里,你也可以使用with语句来创建和写入两个文件 - 这将确保所有生成的数据都被刷新到保存的磁盘中,即使在由于其他文件提前终止的情况下也是如此。错误:

with open("source.txt",'w') as outfile1:
    for line1 in tempDataSrc:
        outfile1.write(line1+'\n')

with open("target.txt",'w') as outfile2:
    for line2 in tempDataTrg:
        outfile2.write(line2+'\n')

with语句将自动关闭文件并刷新数据。