Domanda

Sono nuovo nella programmazione di 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, devo prendere il suo contenuto e passarlo a un'altra funzione Python che ho scritto

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 righe ... La funzione funziona perfettamente sui file letti dal mio computer locale ma non riesco a capire come connettermi a un server remoto e creare questi registri a una riga senza archiviare il contenuto di ciascun file in una stringa e quindi lavorare con la stringa ... Il comando che utilizzo per connettermi 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 prima stabilire una connessione ssh:

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

Tutti i file che devo aprire sono 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 che dovrei modificare il terzo argomento della funzione Popen, ma non riesco a capire come farlo! C'è qualcuno che mi può aiutare ???

È stato utile?

Soluzione

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

for ln in f:
    # work on line in ln

Questo dovrebbe funzionare ugualmente bene per file (usando open () per file ()) e pipe (usando Popen). Utilizzare la proprietà stdout dell'oggetto popen per accedere alla pipe connessa allo stdout del sottoprocesso

Esempio

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

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

Altri suggerimenti

Rimuovi InStream e usa semplicemente l'oggetto file.

In modo che il tuo codice leggesse:

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 " ti darà gli stessi risultati di " per nextLine in f.readlines () " ;.

Per ulteriori informazioni, consultare la documentazione relativa all'oggetto file: http: // docs .python.org / library / stdtypes.html # bltin-file-oggetti

Se vuoi fare qualcosa tramite ssh, perché non utilizzare il modulo SSH Python ?

Prova questa pagina, le migliori informazioni su popen che ho trovato finora ....

http://jimmyg.org/blog/2009/working- con-python-subprocess.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top