我有一个与Python中的文件输入和输出有关的问题(这是这个问题的延续:how to extract specific lines from a data file,现在已经解决了。)
所以我有一个大文件danish.train
和11个小文件(称为danish.test.part-01
等等),每个文件都包含danish.train
文件中不同的数据选择。现在,对于11个文件中的每个文件,我想创建一个补充它们的附带文件。这意味着对于每个小文件,我想创建一个文件,其中包含danish.train
的内容减去小文件中已有的部分。
到目前为止,我想出的是:
trainFile = open("danish.train")
for file_number in range(1,12):
input = open('danish.test.part-%02d' % file_number, 'r')
for line in trainFile:
if line not in input:
with open('danish.train.part-%02d' % file_number, 'a+') as myfile:
myfile.write(line)
问题是这段代码只给出了file_number 1的输出,虽然我有1-11的循环。如果我更改范围,例如更改为in range(2,3)
,则会得到输出danish.train.part-02
,但此输出包含整个danish.train
的副本,而不会遗漏文件的内容{{1我想要的。
我怀疑这些问题可能与我没有完全理解danish.test.part-02
运算符有关,但我不确定。任何帮助将不胜感激。
答案 0 :(得分:1)
当你open
一个文件时,它会通过文件的行返回一个迭代器。这很好,因为它允许您一次一行地浏览文件,而无需一次将整个文件保存到内存中。在您的情况下,它会导致问题,因为您需要多次遍历文件。
相反,您可以将完整的培训文件读入内存,并多次查看:
with open("danish.train", 'r') as f:
train_lines = f.readlines()
for file_number in range(1, 12):
with open("danish.test.part-%02d" % file_number, 'r') as f:
test_lines = set(f)
with open("danish.train.part-%02d" % file_number, 'w') as g:
g.writelines(line for line in train_lines if line not in test_lines)
我也简化了逻辑。如果你不关心线的顺序,你也可以考虑将训练线读入一组,然后只使用set操作而不是我在最后一行中使用的生成器表达式。