2009-03-16 7 views
6

Sono nuovo alla programmazione Python. Ho questo problema: ho un elenco di file di testo (sia compressi che non) e ho bisogno di: - connettersi al server e aprirli - dopo l'apertura del file, ho bisogno di prendere il suo contenuto e passare a un'altra funzione python che ho scrittoPython, reindirizzare lo stream di Popen a una funzione 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 

per elaborare le informazioni contenute in quei file. La funzione ha lo scopo di scrivere in una sola riga i registri che sono memorizzati in quei file usando 3 linee ... La funzione sta funzionando bene sui file letti dalla mia macchina locale ma non riesco a capire come connettermi a un server remoto e creare questi registri una linea senza memorizzare il contenuto di ciascun file in una stringa e poi lavorare con la stringa ... il comando che uso per connettersi al computer remoto è:

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

retList [0] e retList [2] sono l'utente @ remoto e il nome della cartella a cui devo accedere

Grazie a tutti in anticipo!

UPDATE:

Il mio problema è che devo stabilire una connessione ssh prima:

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

Tutti i file che ho bisogno di aprire vengono memorizzati in un elenco, fileList [], parte di essi sono compressi (.gz) e parte sono solo file di testo !! Ho provato tutte le procedure che hai mostrato prima che il bot non funzionasse ... Penso di dover modificare il terzo argomento della funzione Popen ma non riesco a capire come farlo! C'è qualcuno che mi può aiutare ???

risposta

5

Non è necessario suddividere il flusso/file in linee da soli. Basta iterare:

for ln in f: 
    # work on line in ln 

questo dovrebbe funzionare altrettanto bene per i file (usando open() per il file()) e tubi (utilizzando Popen). Utilizzare la proprietà stdout dell'oggetto popen per accedere al tubo collegato stdout del sottoprocesso

Esempio

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

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

Io davvero non capisco, avrei dovuto scrivere qualcosa di simile per nextLine a Popen ([ 'ssh ', retList [0],' cd '+ retList [2] +'; cat '+ fileName], stdout = PIPE) .communicate() [0] nella FOR più esterna della funzione readLogs ??? – wheisenberg

+0

Usa l'attributo stdout per accedere alla pipe. comunicare non aiuterà qui. Ho aggiornato la mia risposta con un esempio. – Ber

1

Rimuovere InStream e basta usare l'oggetto di file.

modo che il codice sarebbe il seguente:

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

Ber ha ragione.

Per chiarire, il comportamento di iterazione predefinito di un oggetto file è di restituire la riga successiva. quindi "per nextLine in f" fornirà gli stessi risultati di "per nextLine in f.readlines()".

Vedere la documentazione oggetto file per i dettagli: http://docs.python.org/library/stdtypes.html#bltin-file-objects