2009-09-27 2 views
1

У меня есть файл, который я использую для централизации всех строк, используемых в моем приложении. Позволяет называть его Strings.txt;Python Script для поиска экземпляров набора строк в наборе файлов

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

Это помогает мне с I18n, проблема в том, что мое приложение теперь намного больше и развилось. Так как многие из этих строк, вероятно, больше не используются. Я хочу устранить те, которые ушли и убрали файл.

Я хочу написать скрипт python, используя регулярные выражения. Я могу получить все псевдонимы строк, но как я могу искать все файлы в иерархии пакетов Java для экземпляра строки? Если есть причина, я использую использование perl или bash, тогда дайте мне знать, как я могу, но я предпочел бы придерживаться одного языка сценариев.

Просьба уточнить, если это не имеет смысла, надеюсь, это просто, я просто не использовал python.

Спасибо заранее,

Гав

ответ

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

+0

@gav, добро пожаловать! –

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 работает с, в принципе, большими файлами со строками, подобными этим :-). Существуют программы-помощники для объединения новых отмеченных строк из источника во все переведенные версии, маркировки неиспользуемых строк и т. Д. И т. Д. Возможно, вам стоит взглянуть на него.