gpt4 book ai didi

Python:替换文件中的多个项目

转载 作者:太空宇宙 更新时间:2023-11-03 19:48:57 26 4
gpt4 key购买 nike

我收到了两个包含数据的文本文件。文件 A 的数据不正确,文件 B 的数据正确。使用 Pandas 库,我能够找到不匹配项(~17000!)。现在我想修改文件A并将不正确的字段替换为正确的字段。例如

File A (Incorrect)
Name = PARAMETER_1
Field_1 = a
Field_2 = b
Field_3 = c
Field_4 = WRONG1!

Name = PARAMETER_2
Field_1 = a
Field_2 = b
Field_3 = c
Field_4 = WRONG2!
etc.

应替换为:

File A (Correct)
Name = PARAMETER_1
Field_1 = a
Field_2 = b
Field_3 = c
Field_4 = CORRECT1!

Name = PARAMETER_2
Field_1 = a
Field_2 = b
Field_3 = c
Field_4 = CORRECT2!
etc.

数据框看起来像:

   Parameter    Wrong    Correct    Match
0 PARAMETER_1 WRONG1! CORRECT1! False
1 PARAMETER_2 WRONG2! CORRECT2! False
etc.

我尝试使用 for 循环来做到这一点:

# read file A
with open(file_A_loc, 'r') as f:
data_text = f.read()

for row in df.itertuples():
new = re.sub(r'(?<=Name = ' + row[1] + r')([\w\W]+?Field_4 = )([\w]+)', r'\g<1>'+row[3], data_text, flags=re.I)

您可以想象,这花了很长时间(文件 A 约为 40-50MB)。有什么建议可以加快这个过程吗?在提交问题之前,我浏览了 stackoverflow 页面,找到了使用字典的引用资料。我尝试使用此方法,但出现了 KeyError:

def foo(rep_dict, text): 

# Create a regular expression from the dictionary keys
regex = re.compile('|'.join(rep_dict.keys()), flags=re.I)

# For each match, look-up corresponding value in dictionary
return regex.sub(lambda x: rep_dict[x.group(0)], text)

rep_dict = {
r'(?<=Name = ' + 'PARAMETER_1' + r')([\w\W]+?Field_4 = )([\w]+)':r'\g<1>'+'CORRECT1!',
r'(?<=Name = ' + 'PARAMETER_2' + r')([\w\W]+?Field_4 = )([\w]+)':r'\g<1>'+'CORRECT2!'
}
bar = foo(rep_dict, data_text)
print(bar)

附注请原谅我的任何 Markdown 违规行为。

更新:我尝试实现方法 herehere 。不过还是需要很长时间。至少它解决了我之前遇到的 KeyError。

最佳答案

我使用以下基本算法解决了我的问题:

  1. 使用 re.findall 捕获文件 A 中的所有内容,并获取以下形式的列表:['名称 = PARAMETER1...Field_4 = WRONG1', '名称 = PARAMETER2...Field_4 = WRONG2', ...]

  2. 使用Pandas获取文件A和文件B之间的差异。

  3. 使用 df.itertuples 迭代行。使用 Pandas 数据框中的索引将 re.sub 应用于步骤 1 中获得的列表中的特定元素。

在我的用例中,此方法的运行时间约为 9-10 秒!

关于Python:替换文件中的多个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59958854/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com