每个人,我都面临着在 python 中用大文本文件(它只是一个单行文件或单个字符串文件)缓慢查找和替换的问题,这需要很多时间来完成这项任务。我有一个 excel 文件,其中文本文件中的“A”列代码可用列“B”替换,但要替换的代码大约为一百万或更多。您可以推荐的任何最快方式。提前致谢。 我尝试了两种列出的方式
# first way
import pandas as pd
import re
df = pd.read_excel("rep-codes.xlsx", header=None, index_col=False, dtype=str)
df.columns = ['A', 'B']
for index, row in df.iterrows():
open_file = open('final.txt', 'r')
read_file = open_file.read()
regex = re.compile((row['A']))
read_file = regex.sub((row['B']), read_file)
write_file = open('final.txt','w')
write_file.write(read_file)
# 2nd way
df = pd.read_excel("rep-codes.xlsx", header=None, index_col=False, dtype=str)
df.columns = ['A', 'B']
fin = open("final.txt", "rt")
data = fin.read()
for index, row in df.iterrows():
data = data.replace((row['A']), (row['B']))
fin.close()
fin = open("final.txt", "wt")
fin.write(data)
fin.close()
答案 0 :(得分:0)
首先,明确满足业务需求的性能。您可以永远优化,但在某些时候,让设备运行多长时间(一夜之间,如有必要),或者以其他方式对其使用蛮力(从 AWS 或同等设备租用强大的机器)会更有效。>
有一个替代正则表达式库 pyre2
(更一般地说,是 Google RE2),它在某些情况下可以更快地工作,尤其是在处理大量文本时。
另一种算法是将 A 列中的所有单词编译成一个正则表达式;这可能与 pyre2
结合使用特别好。类似的东西:
for index, row in df.iterrows():
map[row['A']] = row['B']
def repl(match_obj):
return map[match_obj.group(0)]
regex = re.compile('|'.join(re.escape(index) for index, _row in df.iterrows()))
data = regex.sub(repl, data)
还有一个问题是,是在内存中进行替换,还是直接到输出文件中进行替换。在内存中,每次都需要复制字符串;直接写入磁盘将涉及每个匹配项的库调用。
您必须使用真实数据来衡量这是优势还是劣势。
这种方法也可以扩展到处理大于内存的文件。
您应该调用 regex.sub
而不是 regex.finditer
;对于每个匹配对象,您需要写出直到 match_obj.start() 的字符串部分,然后是替换。最后,把剩下的写出来。
for index, row in df.iterrows():
map[row['A']] = row['B']
regex = re.compile('|'.join(re.escape(index) for index, _row in df.iterrows()))
cur_pos = 0
for match_obj in regex.finditer(data):
out_file.write(data[cur_pos:match_obj.start()])
out_file.write(map[match_obj.group(0)])
cur_pos = match_obj.end()
out_file.write(data[cur_pos:])
我怀疑在大多数情况下这会比 regex.sub()
方法慢,但可能值得一试。
答案 1 :(得分:0)
如果.txt文件只是单列数据,那么操作应该就是这么简单;
df = pd.read_excel("rep-codes.xlsx", header=None, index_col=False, dtype=str)
df.columns = ['A', 'B']
df['B'].to_csv('final.txt')
如果.txt文件是多列,你只需要将a列的值与b列的值交换;
df = pd.read_excel("rep-codes.xlsx", header=None, index_col=False, dtype=str)
df.columns = ['A', 'B']
txt_df = pd.read_csv('final.txt')
txt_df['A']=df['B']
txt_df.to_csv('final.txt')
我还要猜测还有其他一些未提及的因素,例如不同的列大小等。如果需要,请告诉我还需要更改哪些内容。