用Python脚本查找一组文件中字符串的实例
我有一个文件,用来集中管理我应用程序中用到的所有字符串。我们叫它 Strings.txt;
TITLE="Title"
T_AND_C="Accept my terms and conditions please"
START_BUTTON="Start"
BACK_BUTTON="Back"
...
这样做对我处理国际化(I18n)很有帮助,但现在我的应用程序变得更大了,发展也很快。因此,很多字符串可能已经不再使用了。我想把那些不再用的字符串删掉,整理一下这个文件。
我想写一个 Python 脚本,利用正则表达式可以找到所有字符串的别名,但我该如何在一个 Java 包的层级结构中搜索某个字符串的实例呢?如果有理由让我使用 Perl 或 Bash,请告诉我,因为我也可以用,但我更想坚持用一种脚本语言。
如果这段话不太清楚,请随时问我,希望这很简单,我只是对 Python 还不太熟悉。
提前谢谢你,
Gav
5 个回答
0
要解析你的 strings.txt
文件,其实不需要用到正则表达式:
all_strings = [i.partition('=')[0] for i in open('strings.txt')]
如果你想解析你的源代码,可以使用最简单的正则表达式:
re.search('\bTITLE\b', source) # for each string in all_strings
要遍历源代码目录,你可以使用 os.walk
这个工具。
如果 re.search
成功找到匹配的内容,那就说明你需要把这个字符串从 all_strings
中删除;这样你就会剩下需要从 strings.txt
中移除的字符串。
0
4
假设这些文件的大小都比较合适(就像源文件一样),这样你可以轻松地把它们读入内存。而且你要找的是等号右边引号里的内容:
import collections
files_by_str = collections.defaultdict(list)
thestrings = []
with open('Strings.txt') as f:
for line in f:
text = line.split('=', 1)[1]
text = text.strip().replace('"', '')
thestrings.append(text)
import os
for root, dirs, files in os.walk('/top/dir/of/interest'):
for name in files:
path = os.path.join(root, name)
with open(path) as f:
data = f.read()
for text in thestrings:
if text in data:
files_by_str[text].append(path)
break
这样你就能得到一个字典,字典的键是那些在一个或多个文件中出现的文本,值是包含这些文本的文件路径的列表。如果你只关心“这个文本是否存在”的简单答案,而不在乎它在哪里,你可以只用一个集合来节省一些内存,而不是使用默认字典;不过我觉得知道哪些文件包含了每个文本通常是很有用的,所以我建议使用这个更完整的版本。