gpt4 book ai didi

python - 使用纯Python而不是grep?

转载 作者:行者123 更新时间:2023-11-30 23:09:51 24 4
gpt4 key购买 nike

我不熟悉 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/

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