python - 使用纯Python而不是grep?

标签 python grep sublimetext3

我不熟悉 grep 因为我一直在 Windows 系统上,所以当有人建议我将这些行添加到我的代码中时,我有点困惑......

grep = 'grep -E \'@import.*{}\' * -l'.format(name)
proc = Popen(grep, shell=True, cwd=info['path'], stdout=PIPE, stderr=PIPE)

根据我的理解,这是试图在 cwd 中查找本质上包含 @import Given_file_name 的所有文件,对吗?

如果这就是 grep 的工作原理,我需要用 Python 编写一些东西来为我做这件事,但是我担心做这样的事情可能需要时间。

该脚本位于 Sublime Text 3 插件中,该插件运行 sublime_plugin.EventListener 方法 on_post_save 来查找包含刚刚保存的文件名的所有文件并构建文件名列表编译。

def files_that_import(filename, project_root):
    files = []
    for root, dirnames, files in os.walk(project_root):
        for fn in files:
            if fn.endswith(('.scss', '.sass')):
                with open(fn, 'r') as f:
                    data = f.read()
                if re.search(r'@import.*["\']{}["\'];'.format(fn), data):
                    files.append(fn)
    return files

不知道grep到底是如何工作的,这是我能想到的最好的。但是,正如我所说,我担心扫描所有 .scss.sass 文件所需的时间。虽然它们不应该有很多,但获取每个内容的内容似乎比实际情况更复杂。

已更新

我使用@nneonneo 更正更新了代码。我还注意到在我使用的代码中,它正在检查每个文件本身的 @import 语句。

def files_that_import(filename, project_root):
    pattern = re.compile('''@import.*["']{}["'];'''.format(filename))
    found = []
    for root, dirnames, files in os.walk(project_root):
        for fn in files:
            if fn.endswith(('.scss', '.sass')):
                with open(fn, 'r') as f:
                    if any(pattern.search(line) for line in f):
                        found.append(fn)
    return found

更新 如果有人发现这有用并且想要使用该代码,我将 files = [] 更改为 found = [] 因为 files 是在带有 os.walk() 的 for 循环导致错误。

最佳答案

你基本上已经明白了。您可以通过执行以下操作来提高效率:

import_pattern = re.compile(r'''@import.*["']{}["'];'''.format(fn))
with open(fn, 'r') as f:
    for line in f:
        if import_pattern.match(line):
            files.append(fn)
            break

这将扫描每一行,并在找到所需内容后立即中断。它应该比读取整个文件更快。

关于python - 使用纯Python而不是grep?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30952352/

相关文章:

python - 在PythonAnywhere上使用Gevent或Tornado部署Flask

python - 在满足某些条件的情况下(在 Python 中)遍历 DataFrame 并计算 DataFrame 中出现次数的最快方法是什么?

python - 使用时间模块测量耗时

file - Mac打开grep文件列表

regex - 如何从shell中的字符串中检索url?

macos - 我可以更改 Sublime 文本的标题栏像括号一样是黑色的吗?

python - 检查列表是否为空或仅包含零

linux - 在 bash 中提取另一个字符串之后的字符串?

sublimetext3 - 是否可以在不移动光标的情况下复制崇高文本中的一行?

sublimetext3 - "view.window().run_command"和 "view.run_command"之间的区别