Python 如何根据字典进行文本内容替换

qq_36352916 2018-07-10 10:05:04
有A.txt和B.txt两个文本,A文本格式如下(有400多万行,table键分割):

B文本格式如下(200多行,几万列,table键分割):

现在要根据A文本第一列对应的数值对B文本进行替换,得到的效果大概如下:

我也试过写了代码,数据量少的时候很快就可以进行替换,但是用实际数据测试时,跑了一天一夜也没结果,代码如下:

刚刚接触Python不久,希望路过的大神们给点建议,看看怎么修改才好,谢谢~~
...全文
3234 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_36352916 2018-07-12
  • 打赏
  • 举报
回复 1
引用 7 楼 ghostgoodbye 的回复:
[quote=引用 4 楼 qq_36352916 的回复:]
[quote=引用 2 楼 ghostgoodbye 的回复:]
你执行很久的原因在于你替换的时候是查找整个文本进行替换,我执行了一下,替换一行要0.4秒。400万行就是444个小时,要18天半才能替换完成。
所以你替换时可以逐行替换,比如读取一行,然后替换。这样几十秒就能替换完成。


我修改了一下,发现还需要很长很长时间,不知具体怎么修改才好
[/quote]
不要对ab.items进行循环,他数据太多了,可以尝试将B.txt的数据进行拆分,举个例子,以空格拆分:
def replace():
ab = {}
lines = []
with open("A.txt") as f:
for a in f.readlines():
k = a.strip("\n").split(" ")
ab[k[0]] = k[1]
with open("B.txt") as pt:
for line in pt.readlines():
array = line.strip("\n").split(" ")
newline = array[0]
for value in array[1:]:
newline +=" "+ab[value]
lines.append(newline+"\n")
with open("C.txt", "w+") as f:
f.writelines(lines)[/quote]
谢谢大神,6秒不到就完成替换了
qq_36352916 2018-07-11
  • 打赏
  • 举报
回复
[quote=引用 5 楼 u010501845 的回复:]
为什么不用数据库来搞???
哈,刚刚接触Python不久,还不会那么多
ghostgoodbye 2018-07-11
  • 打赏
  • 举报
回复
引用 4 楼 qq_36352916 的回复:
[quote=引用 2 楼 ghostgoodbye 的回复:]
你执行很久的原因在于你替换的时候是查找整个文本进行替换,我执行了一下,替换一行要0.4秒。400万行就是444个小时,要18天半才能替换完成。
所以你替换时可以逐行替换,比如读取一行,然后替换。这样几十秒就能替换完成。


我修改了一下,发现还需要很长很长时间,不知具体怎么修改才好
[/quote]
不要对ab.items进行循环,他数据太多了,可以尝试将B.txt的数据进行拆分,举个例子,以空格拆分:
def replace():
ab = {}
lines = []
with open("A.txt") as f:
for a in f.readlines():
k = a.strip("\n").split(" ")
ab[k[0]] = k[1]
with open("B.txt") as pt:
for line in pt.readlines():
array = line.strip("\n").split(" ")
newline = array[0]
for value in array[1:]:
newline +=" "+ab[value]
lines.append(newline+"\n")
with open("C.txt", "w+") as f:
f.writelines(lines)
fardeas 2018-07-10
  • 打赏
  • 举报
回复
为什么不用数据库来搞???
qq_36352916 2018-07-10
  • 打赏
  • 举报
回复
引用 2 楼 ghostgoodbye 的回复:
你执行很久的原因在于你替换的时候是查找整个文本进行替换,我执行了一下,替换一行要0.4秒。400万行就是444个小时,要18天半才能替换完成。
所以你替换时可以逐行替换,比如读取一行,然后替换。这样几十秒就能替换完成。


我修改了一下,发现还需要很长很长时间,不知具体怎么修改才好
欢乐的小猪 2018-07-10
  • 打赏
  • 举报
回复
不能全部读到内存里。
我是这么想的。
比方一个细小的任务是:取A文件的一行完成B文件一行内容的替换。假设时间为0.01秒。
那么任务的总量将是400万*200多
如果使用带有3000CUDA核心的显卡计算的话,需要44.4分钟。
ghostgoodbye 2018-07-10
  • 打赏
  • 举报
回复
你执行很久的原因在于你替换的时候是查找整个文本进行替换,我执行了一下,替换一行要0.4秒。400万行就是444个小时,要18天半才能替换完成。
所以你替换时可以逐行替换,比如读取一行,然后替换。这样几十秒就能替换完成。
tianfang 2018-07-10
  • 打赏
  • 举报
回复
不能都读进内存做,使用缓冲区方式

读几十行-几百行,处理一下,写到新文件

37,718

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧