2009-09-27 54 views
1

我有一个文件,用于集中我的应用程序中使用的所有字符串。让我们把它叫做Strings.txt;Python脚本在一组文件中查找一组字符串的实例

TITLE="Title" 
T_AND_C="Accept my terms and conditions please" 
START_BUTTON="Start" 
BACK_BUTTON="Back" 
... 

这可以帮助我与I18n,问题是,我的应用程序现在更大,已经发展。因为很多这些字符串可能不再使用。我想消除那些已经完成并整理文件的人。

我想写一个python脚本,使用正则表达式我可以得到所有的字符串别名,但我怎么能搜索Java包层次结构中的所有文件的字符串的实例?如果我有使用perl或bash的理由,那么尽可能让我知道,但我更愿意坚持使用一种脚本语言。

请澄清一下,如果这没有意义,希望这是直截了当的,我只是没有使用python太多。

由于提前,

GAV株系

回答

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+个文件中存在的字典),作为键,以及包含它们作为值的文件的路径列表。如果您只关心“是否将此文本呈现在某处”这个问题的是/否回答,并且不关心在哪里,您可以通过仅保留一组而不是defaultdict来节省一些内存;但我认为通常知道包含每个文本的文件是有用的,所以我建议这个更完整的版本。

+0

梦幻般的答案,非常感谢。 – gav 2009-09-27 18:16:41

+0

@gav,不客气! – 2009-09-27 19:15:48

0

您可以考虑使用ack

% ack --java 'search_string' 

这将在当前目录下进行搜索。

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

您应该考虑使用YAML:易于使用,可读性强。

0

您正在重新发明gettext,这是自由软件领域(甚至是Python之外)翻译程序的标准。

Gettext原则上适用于像这样的字符串的大文件:-)。帮助程序存在合并新的标记字符串从源到所有翻译版本,标记未使用的字符串等等。也许你应该看看它。

相关问题