2009-03-16 16 views
6

Je suis novice en programmation python. J'ai ce problème: J'ai une liste de fichiers texte (compressés et non) et je dois: - se connecter au serveur et les ouvrir - après l'ouverture du fichier, je dois prendre son contenu et passer à une autre fonction python que j'ai écritPython, rediriger le flux de Popen vers une fonction python

def readLogs (fileName): 
f = open (fileName, 'r') 
inStream = f.read() 
counter = 0 
inStream = re.split('\n', inStream) # Create a 'list of lines' 
out = ""    # Will contain the output 
logInConst = ""  # log In Construction 
curLine = ""   # Line that I am working on 

for nextLine in inStream: 
    logInConst += curLine 
    curLine = nextLine 
    # check if it is a start of a new log && check if the previous log is 'ready' 
    if newLogRegExp.match(curLine) and logInConst != "": 

     counter = counter + 1 

     out = logInConst 
     logInConst = "" 
     yield out 

yield logInConst + curLine 

def checkFile (regExp, fileName): 
    generatore = readLogs(fileName) 
    listOfMatches=[] 

    for i in generatore: #I'm now cycling through the logs 
     # regExp must be a COMPILE regular expression 
     if regExp.search(i): 
      listOfMatches.append(i) 
    return listOfMatches 

afin d'élaborer les informations contenues dans ces fichiers. La fonction a pour but d'écrire en 1 ligne les logs qui sont stockés dans ces fichiers en utilisant 3 lignes ... La fonction fonctionne correctement sur les fichiers lus depuis ma machine locale mais je n'arrive pas à comprendre comment me connecter à un serveur distant et créer ces sans mémoriser le contenu de chaque fichier logs d'une ligne dans une chaîne de travail et ensuite avec la chaîne ... la commande que j'utilise pour se connecter à l'ordinateur distant est la suivante:

connection_out = Popen(['ssh', retList[0], 'cd '+retList[2]+'; cat'+fileName], stdout=PIPE).communicate()[0] 

retList [0] et retList [2] sont l'utilisateur @ remote et le nom du dossier auquel je dois accéder

Merci à tous à l'avance!

MISE À JOUR:

Mon problème est que je dois établir une connexion ssh premier:

pr1=Popen(['ssh', '[email protected]', '*~/XYZ/AAAAA/log_archive/00/MSG_090308_162648.gz*' ], stdout=PIPE).communicate()[0] 

Tous les fichiers que je dois ouvrir sont stockés dans une liste, fileList [], une partie d'entre eux sont compressés (.gz) et une partie ne sont que des fichiers texte !! J'ai essayé toutes les procédures que vous avez montré avant que rien ne fonctionne ... Je pense que je vais modifier le troisième argument de la fonction Popen mais je n'arrive pas à comprendre comment le faire! Y a-t-il quelqu'un qui peut m'aider ???

Répondre

5

Vous n'avez pas besoin de diviser le flux/fichier en lignes vous-même. Juste itérer:

for ln in f: 
    # work on line in ln 

Cela devrait fonctionner aussi bien pour les fichiers (en utilisant open() pour le fichier()) et les tuyaux (en utilisant Popen). Utilisez la propriété stdout de l'objet popen pour accéder au tuyau relié à la sortie standard du sous-processus

Exemple

from subprocess import Popen, PIPE 
pp = Popen('dir', shell=True, stdout=PIPE) 

for ln in pp.stdout: 
    print '#',ln 
+0

Je ne comprends vraiment pas, je devrais écrire quelque chose comme pour nextLine dans Popen ([ 'ssh ', retList [0],' cd '+ retList [2] +'; cat '+ nomfichier], stdout = PIPE) .communicate() [0] dans le plus externe FOR de la fonction readLogs ??? – wheisenberg

+0

Utilisez l'attribut stdout pour accéder au tube. communiquer ne va pas aider ici. J'ai mis à jour ma réponse avec un exemple. – Ber

1

Retirez InStream et il suffit d'utiliser l'objet fichier.

Pour que votre code lirait comme suit:

for nextLine in f.readlines(): 
    . 
    . 
    . 

Ber a raison. Pour clarifier, le comportement d'itération par défaut d'un objet fichier est de renvoyer la ligne suivante. "pour nextLine dans f" vous donnera les mêmes résultats que "pour nextLine dans f.readlines()".

Voir la documentation de l'objet fichier pour plus de détails: http://docs.python.org/library/stdtypes.html#bltin-file-objects