我有一个与 Python 中的文件输入和输出有关的问题(这是这个问题的延续: how to extract specific lines from a data file ,现已解决)。
因此,我有一个大文件 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)
,我会得到一个输出 danish.train.part-02
,但此输出包含以下副本整个 danish.train
,而不遗漏文件 danish.test.part-02
的内容,如我所愿。
我怀疑这些问题可能与我没有完全理解 with...as
运算符有关,但我不确定。任何帮助将不胜感激。
最佳答案
当您打开
一个文件时,它会返回一个遍历文件行的迭代器。这很好,因为它可以让您一次一行地浏览文件,而无需将整个文件立即保存到内存中。在您的情况下,它会导致一个问题,因为您需要多次迭代该文件。
相反,您可以将完整的训练文件读入内存,并多次浏览它:
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)
我也稍微简化了逻辑。如果您不关心行的顺序,您还可以考虑将训练行读入集合中,然后仅使用集合操作而不是我在最后一行中使用的生成器表达式。
关于python - 基于另一个文件内容的文件输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14727707/