2009-09-27 53 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原則上適用於像這樣的字符串的大文件:-)。幫助程序存在合併新的標記字符串從源到所有翻譯版本,標記未使用的字符串等等。也許你應該看看它。

相關問題