Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找和替换多个文件上的多个查询的最佳方法是什么?_Python_Regex_Performance_Search_Replace - Fatal编程技术网

Python 查找和替换多个文件上的多个查询的最佳方法是什么?

Python 查找和替换多个文件上的多个查询的最佳方法是什么?,python,regex,performance,search,replace,Python,Regex,Performance,Search,Replace,我有一个文件,其中有200多行是这种格式: name old_id new_id 这个名称对于我目前正在尝试做的事情是无用的,但是我仍然希望它在那里,因为它可能会在以后的调试中变得有用 现在,我需要检查文件夹中的每个文件,找到旧\u id的所有实例,并用新\u id替换它们。我正在扫描的文件是可能有数千行长的代码文件。我需要用我拥有的200多个ID中的每一个扫描每个文件,因为有些可能会在多个文件中使用,并且每个文件会多次使用 做这件事最好的方法是什么?到目前为止,我一直在创建python脚本,

我有一个文件,其中有200多行是这种格式:

name old_id new_id
这个名称对于我目前正在尝试做的事情是无用的,但是我仍然希望它在那里,因为它可能会在以后的调试中变得有用

现在,我需要检查文件夹中的每个文件,找到旧\u id的所有实例,并用新\u id替换它们。我正在扫描的文件是可能有数千行长的代码文件。我需要用我拥有的200多个ID中的每一个扫描每个文件,因为有些可能会在多个文件中使用,并且每个文件会多次使用

做这件事最好的方法是什么?到目前为止,我一直在创建python脚本,以找出旧id和新id的列表,以及哪些id相互匹配,但我的工作效率非常低,因为我基本上是逐行扫描第一个文件并获得当前行的当前id,然后我会逐行扫描第二个文件,直到找到匹配项。然后我对第一个文件中的每一行都重复了一遍,最后我读了很多第二个文件。我不介意这样做效率低下,因为它们是小文件

现在,我正在搜索大约30-50个文件,其中可能包含数千行代码,我希望它更高效一些。这只是一个业余爱好者的项目,所以它不需要非常好,我只是不希望它花费超过5分钟的时间来找到和更换所有的东西,然后看看结果,看到我犯了一个小错误,需要重新做一次。花上几分钟是可以的(尽管我相信现在的电脑几乎可以立即做到),但我不想让它变得可笑

那么最好的方法是什么呢?到目前为止,我一直在使用python,但它不需要是python脚本。我不在乎代码的优雅,也不在乎我做这件事的方式,我只是想要一个简单的方法,用我的新ID替换我所有的旧ID,使用任何最容易使用或实现的工具

示例:

下面是ID列表中的一行。第一部分是名称,可以忽略,第二部分是旧id,第三部分是需要替换旧id的新id

unlock_music_play_grid_thumb_01 0x108043c 0x10804f0
以下是一个要替换的文件中的示例行:

const v1, 0x108043c
我需要能够用新id替换该id,使其看起来像这样:

const v1, 0x10804f0
mmap
中使用类似(我根据您的情况对其进行了编辑)的内容

import os
import os.path
import re
from mmap import mmap
from contextlib import closing


id_filename = 'path/to/id/file'
directory_name = 'directory/to/replace/in'

# read the ids into a dictionary mapping old to new
with open(id_filename) as id_file:
    ids = dict(line.split()[1:] for line in id_file)    

# compile a regex to do the replacement
id_regex = re.compile('|'.join(map(re.escape, ids)))

def translate(match):
    return ids[match.group(0)]

def multiwordReplace(text):
    return id_regex.sub(translate, text)

for code_filename in os.listdir(directory_name):
    with open(os.path.join(directory, code_filename), 'r+') as code_file:
        with closing(mmap(code_file.fileno(), 0)) as code_map:
            new_file = multiword_replace(code_map)
    with open(os.path.join(directory, code_filename), 'w') as code_file:
        code_file.write(new_file)

您还可以从代码文件中添加一些示例行来了解我们要替换的内容吗?感谢您提供的代码,但是我在运行它时遇到了一个错误。文件“/multreplace.py”,第29行,以关闭(mmap(code_File.fileno(),0))作为代码映射:mmap.error:[Errno 13]权限被拒绝。我是该文件的所有者,可以编辑该文件,因此我不确定为什么会收到该文件。@lemons my bad,您需要使用模式
r+
打开文件以获得可写的
mmap
。我来编辑。啊,好的。现在脚本运行了,但是没有任何内容得到修改。我已经将脚本、id文件和文件夹以及所有要更改的文件都放在同一个目录中,并且在脚本无错误运行后,什么都没有更改。在备份之前,我对文件夹进行了备份,并对两个文件夹进行了比较,但它们仍然完全相同。@lemons嘿,我认为
multilereplace
函数更改了文本的位置;没有。修正了。太棒了,现在可以了!你能解释一下里面到底发生了什么吗?我从未使用过mmap,而且我对正则表达式还是新手,所以那个脚本让我有点困惑。我想知道它是如何工作的,这样下次我就可以自己做了:)