使用Python在大型数据集中查找/替换

使用Python在大型数据集中查找/替换,python,Python,我有一个3GB的文件a.txt,格式如下: a 20 g 33 e 312 .... 还有一个b.txt文件,它是a.txt中字母表的映射: e elephant a apple g glue .... 我想合并这两个文件以创建c.txt如下: apple 20 glue 33 elephant 312 ... 我曾尝试编写一个简单的for循环来实现这一点,但失败了。当我运行python文件时,它会运行2秒并停止。这可以通过这样的字典来完成 mapping = {} with open('

我有一个3GB的文件
a.txt
,格式如下:

a 20
g 33
e 312
....
还有一个
b.txt
文件,它是
a.txt
中字母表的映射:

e elephant
a apple
g glue
....
我想合并这两个文件以创建
c.txt
如下:

apple 20
glue 33
elephant 312
...

我曾尝试编写一个简单的for循环来实现这一点,但失败了。当我运行python文件时,它会运行2秒并停止。

这可以通过这样的字典来完成

mapping = {}
with open('b.txt') as f:
  for line in f:
    key, value = line.split()
    mapping[key] = value
with open('a.txt') as i:
  with open('c.txt', 'w') as o:
    for line in i:
      key, value = line.split()
      if key in mapping:
        print(value, mapping[key], file=o)

那么如果
a.txt
是3GB呢?在现代台式计算机上,这仍然会运行得非常快

严格地回答您的问题,这将逐行读取a.txt,扫描b以查找匹配项,将其写出,关闭b,读取a.txt中的下一行,再次打开b等。这应该一次只读取a中的一行。我推断存在一对一的非有序匹配

def process(a,b,outpath):
    outref = open(outpath,'w')
    with open(a,'r') as fh:
        for line in fh:
            key,value = line.split()
            with open(b,'r') as fh_b:
                for b_line in fh_b:
                    bkey, bvalue = b_line.split()
                    if bkey == key:
                        outref.write(bvalue.strip() + ' ' + value.strip() + '\n')
                        continue
    outref.close()
    return 

到底是什么原因使我们无法为循环编写一个简单的
?只是不要将整个文件加载到内存中。不管怎么说,这已经做了一百万次了,让我找一个重复的。@N.Wouda我怎么做?@N.Wouda非常感谢你。我今天标记的太多了,但几乎是重复的。@N.Wouda我一直都在使用它,但当数据集比正常值大时速度很慢。你确定你没有弄错这两个文件吗?
a
b
不应该从另一个方向打开吗?@N.Wouda好的,我确实把它们弄混了。接得好@我在ipython试过,它甚至停止工作了