python 大文件替换对应列

python 大文件替换对应列

现有两个文件,其中一个是配置文件(至少1W条):
4201;aaa
4202;bbb
4203;ccc
……
另一个是目标文件,举例如下(百万来条):
aaa;2019-01-01;xxxx
bbb;2019-02-02;xxxx
ddd;2019-05-05;xxxx
……

现目标使用第一个文件里的第一列替换第二个文件里的第一列,变成如下:
4201;2019-01-01;xxxx
4202;2019-02-02;xxxx
4203;2019-05-05;xxxx
……

python我知道拿字典做,但问题是两个文件都太大了,配置文件至少1W条,那字典也得做1W多。然后目标文件百万来条,逐行读也挺耗的。请问有啥高效点的办法做替换?可以用shell或其他语言,谢谢


回答:

你担忧的有一半是伪问题,1w多个元素的字典并不大,而且字典的时间效率很好。
不管多么“高效”的工具都要逐行读取文本,因为这个问题的逻辑是这样。
你只要注意边读行,边处理,边写入。不要一次全部读入再遍历list,浪费内存。
参考代码:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

def get_config(filename):

config_dic = {}

with open(filename, 'r') as f:

for l in f:

v, k = l.strip().split(';')

config_dic[k] = v

return config_dic

def convert_line(src, cnf):

head, body = src.split(';', maxsplit=1)

head_r = cnf[head]

return ';'.join((head_r, body))

def trans_obj_file(src, dst, cnf):

with open(dst, 'w') as fw:

with open(src, 'r') as fr:

for lr in fr:

lw = convert_line(lr, cnf)

fw.write(lw)

if __name__ == "__main__":

config_file = "conf"

src_obj_file = "object"

dst_obj_file = "object_1"

cnf = get_config(config_file)

trans_obj_file(src_obj_file, dst_obj_file, cnf)


回答:

想要效率高的话,建议将数据load进去数据库中,并在对应列增加索引,之后进行join关联查询。如果想简单的话,下面给个shell的解法:)

$ cat a

4201;aaa

4202;bbb

4203;ccc

$ cat b

aaa;2019-01-01;xxxx

bbb;2019-02-02;xxxx

ddd;2019-05-05;xxxx

$ join -1 2 -a 2 -t ";" -o "1.1,2.1,2.2,2.3" a b

4201;aaa;2019-01-01;xxxx

4202;bbb;2019-02-02;xxxx

;ddd;2019-05-05;xxxx


回答:

就是逐行啊还能怎么样,而且我不知道你说的拿字典是怎么个做法,这个不需要把数据结构完全还原,只需要做简单的文本替换就行了。思路就是两个文件同时逐行流式读取(节约内存),然后对每一行做完处理后流式写入新文件就行了。如果你不知道怎么做,留个评论追问我有空的话用js给你写个


回答:

$ awk -F\; -vOFS=';' 'NR==FNR{a[$2]=$1;next}{$1=a[$1]}1' 1.txt 2.txt >3.txt

$ cat 1.txt

4201;aaa

4202;bbb

$ cat 2.txt

aaa;2019-01-01;xxxx

bbb;2019-02-02;xxxx

$ cat 3.txt

4201;2019-01-01;xxxx

4202;2019-02-02;xxxx

以上是 python 大文件替换对应列 的全部内容, 来源链接: utcz.com/p/198353.html

回到顶部