在python中,从file_B中的file_A中找到一行

时间:2016-02-19 04:36:16

标签: python search match

你好Python专家!!

请查看是否有更好的方法来执行此操作。

我正在尝试在File-B中为File-A中的每一行找到一行。以下代码适用于此目的。

Q1:我的问题是缩放。我有2个文件,每个文件有50MM行。能帮助你提供一个更好的方式吗?

Q2:另外,我需要从File-B中找到File-A中的值(基本上是切换文件)。我打算通过切换文件名来两次使用相同的脚本。有一种有效的方法可以在一次运行中完成这项工作吗?

fileA = open("file_a.txt","r")
linesOfA = fileA.readlines()

fileB = open("file_b.txt","r")

for lineB in fileB:
    if lineB in linesOfA:
        print "same",lineB

FILE_A:

123123123
123123456
123123789

FILE_B:

456456123
456456456
456456789
123123456

结果:

same 123123456

我非常感谢您提供的任何帮助。 谢谢

2 个答案:

答案 0 :(得分:0)

假设文件每行只包含一个数字,其中一个选项是使用集合:

a = set([1, 5, 6, 0])
b = set([0, 8, 2, 3, -5])
a.difference(b)   # returns: {1, 5, 6}
a.intersection(b) # returns {0}
b.difference(a)   # returns: {-5, 2, 3, 8}

从您的代码中,我收集您的计算机可以将其全部记忆在内存中。 您正在寻找交叉情况。而且,文件A具有的任何值也在B中,也与B中的值相同(这听起来很奇怪,因为它是如此合乎逻辑)。这是因为两组的交集对于两者都是相同的。

您需要做的就是使用

a = set(linesOfA)

和B类似。

注意这种方法(使用集合)将忽略其中一个文件中所有的双重值。因此,如果文件A的行数为“24”的两倍,则代码将打印24次。使用集合,您只能看到24次。

答案 1 :(得分:0)

请注意,有一个名为comm的unix实用程序(以及一个GNU替换,calm)将为已排序的文件执行此任务。

您可以对文件进行排序(使用sort),然后进行传递。例如:

$ sort fileA.txt > fileA.sorted
$ sort fileB.txt > fileB.sorted
$ comm -12 fileA.sorted fileB.sorted > lines_in_both_files.txt

显然,这不是Python解决方案。但是你可以期待比这些尺寸的Python更好的性能。