在多个文件上查找相同的行

时间:2015-03-09 19:44:24

标签: python python-2.7

我知道有很多类似的问题,但似乎都没有。

让我开始吧:

我有两个文件,一个名为client-gen.txt,另一个名为server-gen.txt。这些文件包含随机生成的SHA1字符串,例如:

902ba3cda1883801594b6e1b452790cc53948fda
356a192b7913b04c54574d18c28d46e6395428ab
c1dfd96eea8cc2b62785275bca38ac261256e278
1b6453892473a467d07372d45eb05abc2031647a
77de68daecd823babbb58edb1c8e14d7106e83bb

现在,问题是,如果我有另一个文件,看起来像这样:

77de68daecd823babbb58edb1c8e14d7106e83bb
da4b9237bacccdf19c0760cab7aec4a8359010b0
356a192b7913b04c54574d18c28d46e6395428ab
1b6453892473a467d07372d45eb05abc2031647a
356a192b7913b04c54574d18c28d46e6395428ab
ac3478d69a3c81fa62e60f5c3696165a4e5e6ac4
da4b9237bacccdf19c0760cab7aec4a8359010b0
356a192b7913b04c54574d18c28d46e6395428ab
1b6453892473a467d07372d45eb05abc2031647a
da4b9237bacccdf19c0760cab7aec4a8359010b0

如何比较这些文件,并在这种情况下打印:

77de68daecd823babbb58edb1c8e14d7106e83bb
1b6453892473a467d07372d45eb05abc2031647a
1b6453892473a467d07372d45eb05abc2031647a

订单并不重要。

仅供参考,我已尝试使用set()和其他方法。他们似乎都没有工作。

如果你能提供帮助,我真的很感激

4 个答案:

答案 0 :(得分:1)

您可以使用Counter,然后只打印值为2的项目。由于打开的文件是可迭代的(即,当您使用for循环时可以遍历行),您可以调用Counter直接打开文件:

from collections import Counter
with open('file1') as file1, open('file2') as file2:
    ids = Counter(file1)
    ids.update(file2)
for key, value in ids.items():
    if value > 1:
        print(key)

此方法将包括尾随换行符。这可能不是你想要的;如果是这种情况,您将必须显式迭代文件并明确删除空白:

from collections import Counter
with open('file1') as file1, open('file2') as file2:
    ids = Counter()
    for line in file1:
        ids.update([line.strip()])
    for line in file2:
        ids.update([line.strip()])

for key, value in ids.items():
    if value > 1:
        print(key)

答案 1 :(得分:1)

按字母顺序对两个文件进行排序。然后在单个类似合并的传递中,您将找到所有重复项。

答案 2 :(得分:1)

我认为您的预期输出不正确,因为您不包含'356a192b7913b04c54574d18c28d46e6395428ab',如果您希望两个文件中出现的元素都使用set.intersection,那么您的第二个文件中会出现两次with open("a.txt") as a, open("b.txt") as b: st = set(map(str.rstrip,a)) print("\n".join(st.intersection(map(str.rstrip,b)))) 356a192b7913b04c54574d18c28d46e6395428ab 1b6453892473a467d07372d45eb05abc2031647a 77de68daecd823babbb58edb1c8e14d7106e83bb

{{1}}

答案 3 :(得分:0)

cl = [l.strip() for l in open("client-gen.txt")]
sl = [l.strip() for l in open("server-gen.txt")]
common = filter(lambda l: l in sl, cl)