2009-09-27 7 views
1

J'ai un fichier que j'utilise pour centraliser toutes les chaînes utilisées dans mon application. Appelons-le Strings.txt; Cela m'aide avec I18n, le problème est que mon application est maintenant beaucoup plus grande et a évolué. Beaucoup de ces chaînes ne sont probablement plus utilisées. Je veux éliminer ceux qui ont disparu et ranger le fichier. Je veux écrire un script python, en utilisant des expressions régulières Je peux obtenir tous les alias de chaîne mais comment puis-je rechercher tous les fichiers dans une hiérarchie de paquets Java pour une instance d'une chaîne? S'il y a une raison pour laquelle j'utilise l'utilisation de perl ou bash alors faites le moi savoir comme je peux mais je préférerais m'en tenir à un langage de script.Python Script pour trouver des instances d'un ensemble de chaînes dans un ensemble de fichiers

S'il vous plaît demander des éclaircissements si cela n'a pas de sens, j'espère que c'est simple, je n'ai pas beaucoup utilisé Python.

Merci à l'avance,

Gav

Répondre

4

Si l'on suppose que les fichiers sont de taille raisonnable (comme les fichiers source seront) afin que vous puissiez les lire facilement en mémoire, et que vous êtes à la recherche pour les parties entre guillemets droite des signes =:

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 

Cela vous donne une dictée avec les textes (ceux qui sont présents dans les fichiers 1+, seulement), comme des clés, et des listes des chemins d'accès aux fichiers les contenant comme des valeurs. Si vous vous souciez seulement d'une réponse oui/non à la question «est ce texte présent quelque part», et ne vous souciez pas où, vous pouvez économiser de la mémoire en ne conservant qu'un ensemble à la place du defaultdict; mais je pense que savoir souvent quels fichiers contiennent chaque texte sera utile, donc je suggère cette version plus complète.

+0

Réponse fantastique, grandement appréciée. – gav

+0

@gav, de rien! –

0

Vous pourriez envisager d'utiliser ack.

% ack --java 'search_string' 

Ceci sera recherché dans le répertoire courant.

0

pour analyser votre strings.txt vous n'avez pas besoin d'expressions régulières:

all_strings = [i.partition('=')[0] for i in open('strings.txt')] 

pour analyser la source que vous pouvez utiliser le plus stupide regex:

re.search('\bTITLE\b', source)  # for each string in all_strings 

marcher le répertoire source que vous pouvez utiliser os.walk .

Réussie re.search signifierait que vous devez supprimer cette chaîne de la all_strings: il vous restera des chaînes qui doivent être supprimées de strings.txt.

0

Vous devriez envisager d'utiliser YAML: facile à utiliser, lisible par l'homme.

0

Vous êtes en train de réinventer gettext, la norme pour la traduction de programmes dans le domaine du logiciel libre (même en dehors de python). Gettext fonctionne avec, en principe, de gros fichiers avec des chaînes comme :-). Des programmes auxiliaires existent pour fusionner les nouvelles chaînes marquées de la source dans toutes les versions traduites, en marquant les chaînes inutilisées, etc. Vous devriez peut-être jeter un coup d'œil.

Questions connexes