【问题标题】:Python, comparing two filesPython,比较两个文件
【发布时间】:2017-11-07 15:10:19
【问题描述】:

假设我有两个(巨大的)文件。一个包含单词列表。另一个包含一个单词列表,后面跟着一些数字;即,格式是这样的:

文件 1:

word1

word2

 ...

文件 2:

word1 n1 n2 n3 n4 n5.....n500


word2 n1 n2 n4 n5 .... n500


 ...

使用 Python 3,重叠文件并从文件 2 中仅提取包含文件 1 中也出现的单词的行的最有效方法是什么?为文件 2 创建一个字典,然后检查它并使用文件 1 中的单词检查成员资格非常慢。

【问题讨论】:

  • 您是否尝试过相反的方法?从 file1 的单词创建字典,然后遍历 file2?
  • 你说的“很慢”是指操作需要很长时间,还是你的机器变慢了?
  • 我确实尝试从文件 1 创建字典并遍历文件 2。仍然很慢。慢,我的意思是操作需要很长时间。

标签: python


【解决方案1】:

这仅在文件顺序相同且文件 1 中的单词纯粹是文件 2 中单词的子集时才有效:

def gen_overlap(file1, file2):
    for word in file1:
        line = file2.read()
        while word not in line:
            line = file2.read()
        yield line

如果它们不满足其中任何一个条件,最好的方法是创建一个包含所有单词的set

gen_overlap(file1, file2):
    word_set = set(line.split() for line in file1)
    for line in file2:
        if line.split()[0] in word_set:
            yield line

【讨论】:

  • 不,它们的顺序不同,一个不是另一个的子集。
  • 最好的方法是创建文件 1 中所有单词的set,并检查该集合中文件 2 中任何单词的成员资格。查看我的编辑。
【解决方案2】:

使用这个:-

def file_comp(a_file,b_file):
    with open(a_file,'r') as file1,open(b_file,'r') as file2:
        read1 = file1.read()
        read2 = file2.read()
        return([i for i in read2.split('\n') if i.split(" ")[0] in read1.split('\n')])
print(file_comp('file_1.txt','file_2.txt'))

【讨论】:

  • OSError: [Errno 22] 无效参数
  • 我在使用 file1.read() 时不断收到这个错误——可能是文件太大了?
  • 这对我有用...您收到此错误是因为您打开文件的参数不正确。请检查您提供的文件的文件名或路径。请让我知道,以防它仍然无法解决您收到的错误。
  • 不,文件名和路径都正确。我用上面的建议解决了这个问题。谢谢!