1

我有一个与 Python 中的文件输入和输出有关的问题(这是这个问题的延续:如何从数据文件中提取特定行,现在已经解决)。

所以我有一个大文件danish.train和 11 个小文件(称为danish.test.part-01等等),每个文件都包含从danish.train文件中选择的不同数据。现在,对于十一个文件中的每一个,我都想创建一个补充文件。这意味着对于每个小文件,我想创建一个文件,其中包含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),我会得到一个 output danish.train.part-02,但是这个输出包含一个完整的副本,而不会像我想要danish.train的那样遗漏文件的内容。danish.test.part-02

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

4

1 回答 1

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)

我也稍微简化了逻辑。如果您不关心行的顺序,您还可以考虑将训练行读入一个集合,然后只使用集合操作而不是我在最后一行中使用的生成器表达式。

于 2013-02-06T12:02:08.350 回答