2009-03-16 10 views
6

Ich bin neu in der Python-Programmierung. Ich habe dieses Problem: Ich habe eine Liste von Textdateien (beide komprimiert und nicht) und ich muss: - verbinden mit dem Server und öffnen Sie sie - nach dem Öffnen der Datei muss ich seinen Inhalt nehmen und übergeben es auf eine andere python-Funktion, die ichPython, den Stream von Popen zu einer Python-Funktion umleiten

schrieb
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 

, um die Informationen in diesen Dateien enthalten sind, zu erarbeiten. Die Funktion hat das Ziel, in nur einer Zeile die Protokolle zu schreiben, die in diesen Dateien mit 3 Zeilen gespeichert werden ... Die Funktion funktioniert gut für Dateien von meinem lokalen Computer gelesen, aber ich kann nicht herausfinden, wie Sie eine Verbindung zu einem Remote-Server herstellen und erstellen diese einzeiligen logs ohne den Inhalt jeder Datei in einen String speichert und dann mit der Zeichenfolge arbeitet ... der Befehl, den ich an den entfernten Rechner verbinden verwenden ist:

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

retList [0] und retList [2] sind der Benutzer @ remote und der Ordnername, auf den ich zugreifen muss

Vielen Dank an alle im Voraus!

UPDATE:

Mein Problem ist, dass ich eine SSH-Verbindung zu schaffen haben zuerst:

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

Alle Dateien, die ich benötige, werden in einer Liste gespeichert zu öffnen, filelist [], Teile davon sind komprimiert (.gz) und Teile sind nur Textdateien !! Ich habe alle Prozeduren ausprobiert, die vor dem Bot angezeigt wurden, aber nichts hat funktioniert ... Ich denke, dass ich das dritte Argument der Popen-Funktion modifizieren muss, aber ich kann nicht herausfinden, wie es geht! Gibt es jemanden, der mir helfen kann ???

Antwort

5

Sie müssen den Stream/die Datei nicht selbst in Zeilen aufteilen. Nur iterieren:

for ln in f: 
    # work on line in ln 

Dies sollte gleichermaßen gut für Dateien arbeiten (mit open() für Datei()) und Rohre (mit Popen). Verwenden Sie die stdout Eigenschaft des popen Objekt um das Rohr zu stdout des subprocess verbunden zuzugreifen

Beispiel

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

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

Ich verstehe nicht wirklich, ich sollte so etwas wie für nextline in Popen ([ 'ssh schreiben ', retList [0],' cd '+ retList [2] +'; cat '+ Dateiname], stdout = PIPE) .communicate() [0] im äußersten FOR der Funktion readLogs ??? – wheisenberg

+0

Verwenden Sie das stdout-Attribut, um auf die Pipe zuzugreifen. kommunizieren wird hier nicht helfen. Ich habe meine Antwort mit einem Beispiel aktualisiert. – Ber

1

InStream entfernen und nur die Datei-Objekt verwenden.

Damit Ihr Code würde lauten:

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

Ber es Recht hat.

Um zu verdeutlichen, ist das Standard-Iterationsverhalten eines Dateiobjekts, die nächste Zeile zurückzugeben. so "für nextLine in f" gibt Ihnen die gleichen Ergebnisse wie "für nextLine in f.readlines()".

Siehe Dateiobjekt Dokumentation: http://docs.python.org/library/stdtypes.html#bltin-file-objects