你好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
我非常感谢您提供的任何帮助。 谢谢
答案 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更好的性能。