我在directory1
中使用源语言中的25个文件和directory2
中的目标语言中的25个文件标记了部分语音(POS)并行语料库。每个文件包含1000行,即每个目录25000行。
手头的任务:我想删除POS标记,然后在单个文本文件中写出源语言和目标语言中的所有文本,例如source.txt
& target.txt
。
幸运的是,我这样做了(参见下面的代码)但是当我运行代码时 - 有时source.txt
或target.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方式编写代码的任何建议
答案 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
语句将自动关闭文件并刷新数据。