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 a4201;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