2010-11-04 10 views
0

J'ai couru une commande grep et trouvé plusieurs centaines d'instances d'une chaîne dans un grand répertoire de données. Ce fichier est de 2 Mo et a des chaînes que je voudrais extraire et mettre dans un fichier Excel pour un accès facile plus tard. La partie que j'extrais est un chemin vers un fichier de données sur lequel je dois travailler plus tard.Trouver "chaîne" dans le fichier texte - Ajouter au fichier Excel en utilisant Python

J'ai lu récemment à propos de Python et je pensais pouvoir faire cette extraction automatiquement. Mais je suis un peu perplexe comment commencer. J'ai ce jusqu'à présent:

data = open("C:\python27\text.txt").read()
if "string" in data:

Mais je ne suis pas sûr de ce à utiliser pour sortir du fichier ce que je veux. Quelque chose pour un débutant à mâcher?

EDIT
Voici quelques informations supplémentaires sur ce que je cherchais. J'ai plusieurs centaines de lignes dans un fichier texte. Chaque ligne a un chemin et quelques chaînes comme ceci:

/path/to/file:STRING=SOME_STRING, ANOTHER_STRING

Ce que je voudrais à partir de ces lignes sont les chemins de ces lignes avec un spécifique « STRING = SOME_STRING ». Par exemple, si la ligne ressemble à ceci, je veux que le chemin (/path/to/file) à extraire dans un autre fichier:

/path/to/file:STRING=SOME_STRING

+0

Désolé, mais je pense que je ne pouvais pas comprendre votre problème correctement: Vous voulez trouver "chaîne" dans votre fichier, et pour que votre code devrait fonctionner. Alors vous savez "chaîne" est à l'intérieur du fichier. Que voulez-vous extraire exactement après que vous le sachiez? – malvim

+0

Je veux extraire un chemin qui se trouve juste avant la chaîne trouvée et l'ajouter à un fichier Excel. Par exemple:/path/to/string/file: "string_I_found" = ... Je veux la partie "/ path/to/string/file" dans un fichier Excel. Il y en a peut-être 300 dans le fichier que j'essaie d'analyser. – nicorellius

+0

Vous pouvez étudier la version de [expressions régulières] de Python (http://docs.python.org/library/re.html) si vous ne les connaissez pas déjà. – GreenMatt

Répondre

1

Les étapes pour ce faire sont les suivantes:

  • Faites une liste de tous les fichiers du répertoire (Ce n'est pas nécessaire si vous êtes seulement intéressé par un fichier unique)
  • Extrait les noms des fichiers qui vous intéressent
  • dans une boucle, lire dans les fichiers ligne par ligne
  • Voir si la ligne correspond à votre modèle
  • Extrait la partie de la ligne avant le premier : caractère

Ainsi, le code ressemblerait à quelque chose comme ceci, à condition vos fichiers texte sont en forme comme vous avez montré dans la question et que ce format est fiable corriger:

import sys, os, glob 

dir_path = sys.argv[1] 
if dir_path[-1] != os.sep: dir_path+=os.sep 

file_list = glob.glob(dir_path+'*.txt') #use standard *NIX wildcards to get your file names, in this case, all the files with a .txt extension 

with open('out_file.csv', 'w') as out_file: 
    for filename in file_list: 
     with open(filename, 'r') as in_file: 
      for line in in_file: 
       if 'STRING=SOME_STRING' in line: 
        out_file.write(line.split(':')[0]+'\n') 

Ce programme sera exécuté en tant que python extract_paths.py path/to/directory et vous donnera un fichier appelé out_file.csv dans votre répertoire courant.

Ce fichier peut ensuite être importé dans Excel en tant que fichier CSV. Si votre contribution est moins fiable que ce que vous avez suggéré, les expressions régulières pourraient être un meilleur choix.

+0

Nice. J'ai ce script qui marche. Je vous remercie. Je pense pour me tester, je vais essayer d'obtenir la récursivité pour cela. Je n'ai pas mentionné dans la question que je voudrais rechercher un répertoire qui a beaucoup de sous-répertoires ... – nicorellius

+0

Regardez 'os.walk' en combinaison avec' glob.glob' si vous voulez recurrencer à travers les sous-répertoires. –

3

Tout cela se fait assez facilement avec Python standard, mais pour « Excel » (xls, ou xlsx) - vous devez installer une bibliothèque tierce pour cela. Cependant, si vous n'avez besoin que d'une table 2D que cna ouvre sur un tableur, vous pouvez utiliser des fichiers CSV (Comma Separated Values), compatibles avec Excel et d'autres tableurs, et intégrés dans Python. Quant à la recherche d'une chaîne dans un fichier, elle est simple. Vous n'aurez peut-être même pas besoin d'expressions régulières pour la plupart des choses. Quelles informations voulez-vous avec la chaîne?

De plus, le module "os" de standardlib a quelques fonctions pour lister tous les fichiers dans un répertoire, ou dans une arborescence de répertoires. Le plus simple est os.listdir (chemin)

Les méthodes de type "count" et "find" peuvent être utilisées au-delà de "in" pour localiser la chaîne dans un fichier ou compter le nombre d'occurrences. Enfin, le module "CSV" peut écrire un fichier correctement formaté à lire dans une feuille de calcul. En cours de route, vous pouvez abuser des objets listés par python comme un moyen facile de manipuler les ensembles de données.

Voici un exemple de programme qui compte les chaînes données dans la ligne de commande trouvée dans les fichiers d'un répertoire donné, et assemble a.tableau CSV avec eux:

# -*- coding: utf-8 -*- 
import csv 
import sys, os 

output_name = "count.csv" 

def find_in_file(path, string_list): 
    count = [] 
    file_ = open(path) 
    data = file_.read() 
    file_.close() 
    for string in string_list: 
     count.append(data.count(string)) 
    return count 


def main(): 
    if len(sys.argv) < 3: 
     print "Use %s directory_path <string1>[ string2 [...]])\n" % __package__ 
     sys.exit(1) 
    target_dir = sys.argv[1] 
    string_list = sys.argv[2:] 
    csv_file = open(output_name, "wt") 
    writer = csv.writer(csv_file) 
    header = ["Filename"] + string_list 
    writer.writerow(header) 
    for filename in os.listdir(target_dir): 
     path = os.path.join(target_dir, filename) 
     if not os.path.isfile(path): 
      continue 
     line = [filename] + find_in_file(path, string_list) 
     writer.writerow(line) 
    csv_file.close() 

if __name__=="__main__": 
    main() 
+0

Merci pour la réponse. Je vais regarder de plus près et voir si je peux comprendre ce qu'il fait. Plus précisément, j'ai un fichier avec plusieurs centaines de lignes comme ceci:/path/to/file: "string" = "more string". La partie que je veux est le chemin qui vient directement avant le ":". Voir ma question originale pour plus de détails ... – nicorellius

Questions connexes