如何在Python中实现“grep -lr”?

jjhzyzn0  于 2023-05-02  发布在  Python
关注(0)|答案(2)|浏览(108)

我有一个带有遗留错误代码的大型intEnum对象。

class ErrorCodes(IntEnum):
    ERROR_UNKNOWN = 1
    ERROR_PERMISSION_DENIED = 3201
    ... # over 9000
    ERROR_LEGACY_AS_FOOBAR = 10001

我可以通过执行“grep -lr”来检查它们是否被删除<error_name>,并查看哪些没有在其他任何地方导入。但是对每个错误代码执行此操作需要很长时间。如何在Python中实现自动化?有没有可能对脚本中的每个错误名称都调用“grep”,或者在python标准库中有没有更好的工具?我用的是Python 3。10.

jbose2ul

jbose2ul1#

下面是一个简单的shell脚本。

sed -n 's/.*\(ERROR_[_A-Z0-9a-z]*\).*/\1/p' file.py |
grep -rlFf - path/to/errordir

根据您的用例,您可能希望对输出进行后处理,以便按错误名称进行分组。您的问题并没有更详细地揭示您希望输出做什么。
sed脚本假定每行有一个错误,并且所有错误都以ERROR_开头。提取的错误被传递给grep -Ff -,它从标准输入中读取模式,每行一个,并按字面意思搜索它们(因此任何正则表达式特殊字符都只是按字面意思匹配;在这里,我们这样做主要是为了加快处理速度)。

8dtrkrch

8dtrkrch2#

我写了一个很简单的脚本。但可能不太准确。但它对我的问题很有效。可能对某人有用

import os, sys
def parse_file_by_errors() -> dict[str, set]:

    # We map error names with empty sets, which will be filled with files, with imports
    ERROR_IMPORT_MAP = {key: set() for key in list(Errors.__members__)}

    root_dir = './src/'
    for subdir, dirs, files in os.walk(root_dir):
        for file in files:
            if file.endswith('.py'): 
                file_path = os.path.join(subdir, file)  # get file path
                with open(file_path, 'r') as f:  
                    python_text = f.read() 
                    for error_name in ERROR_IMPORT_MAP.keys():
                        if error_name in python_text:
                            ERROR_IMPORT_MAP[error_name].add(file_path)
    return ERROR_IMPORT_MAP

相关问题