2013-02-06 65 views
1

我有一个问题,它与Python中的文件输入和输出有关(这是对此问题的延续:how to extract specific lines from a data file,现已解决)。基于另一个文件的内容的文件输出

所以我有一个很大的文件,danish.train,十一小文件(称为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的一个副本而不会忽略文件danish.test.part-02的内容,如我所愿。

我怀疑这些问题可能与我没有完全了解with... as运营商有关,但我不确定。任何帮助将不胜感激。

回答

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操作而不是最后一行中使用的生成器表达式。

+0

非常感谢你!这真的很有帮助! – Johanna

相关问题