python - 基于另一个文件内容的文件输出

标签 python file-io

我有一个与 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/

相关文章:

python - 在 pandas 中的 groupby 之后添加一个新列

objective-c - ObjC:写入.plist,优化方式?

python - 如何在 Python 中找到两个向量具有相等元素的索引集

python - 删除不需要的字符并在 Python 中转换为 int

linux - 如何使某些文件对进程可见,以及当某些进程访问它然后提供某些 Internet 流的内容时?

java - 获取目录中与文件名中特定字符串匹配的图像文件名列表

excel - 如何重新启动文件输入循环

Python:不使用 argparse 显示 'choices'

python - Unresolved 导入 : models

python记录字符串格式化