在python中查找和替换大型文本文件(单行文件或单字符串文件)的最快方法

时间:2021-02-21 23:07:46

标签: python pandas dataframe replace

每个人,我都面临着在 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()

2 个答案:

答案 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')

我还要猜测还有其他一些未提及的因素,例如不同的列大小等。如果需要,请告诉我还需要更改哪些内容。

相关问题