我有两个文本文件。它们包含大约75,000(比如file1)和550,000(比如file2)行。文件实际上有逗号分隔的csv格式。
我需要以一对多关系匹配(通过公共字段)从file1到file2中的行的行(所以我不能在第一次找到的匹配时停止处理)。另外,file1中的不同行可以在file2中具有相同的匹配(因此我无法从file2中删除已匹配的行)。
我尝试了简单的嵌套for循环,但需要花费大量时间来匹配它们。我想到了生成器,但这不是一个例子,因为我需要多次遍历file2。 有没有办法让它快速?
UPD。文件的顺序无关紧要。我从file1读取行,将其拆分为一些字段并与file2中的常用字段进行比较。如果匹配,我将从file2添加几个字段到列表以进行进一步操作。
答案 0 :(得分:1)
如果这两个文件的匹配行顺序不同,我的意思是,例如,如果file1中的第一行与file2中的最后一行匹配,那么除了读取一个文件之外没有其他方法可以执行您想要的操作进入记忆。您可以将其读取为搜索匹配项有用的内容,例如dict
,以便能够在O(1)
中找到该行的匹配项。
您能否提供两个简短的示例文件来了解匹配规则?然后我会尝试为此编写一些代码。
<强>更新强>
由于您只提供了两行而不是两个文件,我试图运用我的想象力。
我使用以下代码创建了两个文件:
#!/usr/bin/python3.5
import random
with open('file1', 'w') as f1, open('file2', 'w') as f2:
for _ in range(10):
f1.write('{},{},{},{},track-{}\n'.format(*[random.randrange(5) for x in range(5)]))
f2.write('stage-{},{},{},{},{}\n'.format(*[random.randrange(5) for x in range(5)]))
文件1:
4,4,3,1,track-0
3,1,0,2,track-0
1,2,3,1,track-3
0,1,2,1,track-2
0,0,4,2,track-2
0,2,3,1,track-0
0,4,4,0,track-0
2,1,4,3,track-1
2,1,4,1,track-1
1,1,0,3,track-4
file2的:
stage-0,3,1,1,0
stage-3,2,1,0,1
stage-1,2,4,3,3
stage-0,4,0,1,3
stage-3,4,3,3,3
stage-0,0,3,2,1
stage-2,2,1,3,4
stage-4,3,1,0,3
stage-1,1,4,1,2
stage-3,0,1,3,4
然后,以下代码:
import re
d, regex = {}, re.compile('stage-(\\d+)')
with open('file2') as f2:
for line in f2:
value = int(regex.match(line).group(1))
if value not in d: d[value] = []
d[value].append(line[:-1])
regex = re.compile('.*track-(\\d+)')
with open('file1') as f1:
for line in f1:
value = int(regex.match(line).group(1))
print(line[:-1])
if value not in d: print(' no matches')
else:
for x in d[value]: print(' MATCH: ' + x)
提供以下输出:
4,4,3,1,track-0
MATCH: stage-0,3,1,1,0
MATCH: stage-0,4,0,1,3
MATCH: stage-0,0,3,2,1
3,1,0,2,track-0
MATCH: stage-0,3,1,1,0
MATCH: stage-0,4,0,1,3
MATCH: stage-0,0,3,2,1
1,2,3,1,track-3
MATCH: stage-3,2,1,0,1
MATCH: stage-3,4,3,3,3
MATCH: stage-3,0,1,3,4
0,1,2,1,track-2
MATCH: stage-2,2,1,3,4
0,0,4,2,track-2
MATCH: stage-2,2,1,3,4
0,2,3,1,track-0
MATCH: stage-0,3,1,1,0
MATCH: stage-0,4,0,1,3
MATCH: stage-0,0,3,2,1
0,4,4,0,track-0
MATCH: stage-0,3,1,1,0
MATCH: stage-0,4,0,1,3
MATCH: stage-0,0,3,2,1
2,1,4,3,track-1
MATCH: stage-1,2,4,3,3
MATCH: stage-1,1,4,1,2
2,1,4,1,track-1
MATCH: stage-1,2,4,3,3
MATCH: stage-1,1,4,1,2
1,1,0,3,track-4
MATCH: stage-4,3,1,0,3
不确定这是你想要的,但是我尝试用75K和550K行创建大文件,生成它们需要3秒钟,而只需要解析一半秒(没有控制台输出的时间,需要几个分钟,并通过评论print
s)来关闭