我有一个文件,用于集中我的应用程序中使用的所有字符串。让我们称之为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株系
答案 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
这将为您提供包含文本(仅存在于1+文件中的文本)的词典,作为键,以及包含它们作为值的文件的路径列表。如果你只关心“这个文本存在于某个地方”这个问题的是/否答案,而不关心在哪里,你可以通过只保留一个集而不是默认值来节省一些内存;但我认为通常知道每个文本中包含哪些文件会很有用,所以我建议使用更完整的版本。
答案 1 :(得分:0)
答案 2 :(得分: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
删除的字符串。
答案 3 :(得分:0)
您应该考虑使用YAML:易于使用,人类可读。
答案 4 :(得分:0)
您正在重新发明gettext,这是在自由软件领域(甚至在python之外)翻译程序的标准。
Gettext原则上适用于包含以下字符串的大型文件:-)。 Helper程序的存在是为了将新标记的字符串从源代码合并到所有翻译版本中,标记未使用的字符串等等。也许你应该看看它。