2009-03-16 6 views
6

Soy nuevo en la programación de python. Tengo este problema: tengo una lista de archivos de texto (tanto comprimidos como no) y necesito: - conectarme al servidor y abrirlos - después de la apertura del archivo, necesito tomar su contenido y pasarlo a otra función de python que escribíPython, redireccionando la secuencia de Popen a una función de pitón

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 

para elaborar la información contenida en esos archivos. La función tiene el objetivo de escribir en solo 1 línea los registros que están almacenados en esos archivos usando 3 líneas ... La función funciona bien en archivos leídos desde mi máquina local pero no puedo encontrar la manera de conectarme a un servidor remoto y crear estos registros de una sola línea sin almacenar el contenido de cada archivo en una cadena y luego trabajar con la cadena ... el comando que utilizo para conectar a la máquina remota es:

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

retList [0] y retList [2] son ​​el usuario @ remote y el nombre de la carpeta a la que tengo que acceder

¡Gracias a todos por adelantado!

ACTUALIZACIÓN:

Mi problema es que tengo que establecer una conexión ssh primero:

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

Todos los archivos que necesito para abrir se almacenan en una lista, fileList [], parte de ellos están comprimidos (.gz) y parte son solo archivos de texto !! He intentado todos los procedimientos que mostraste antes de que nada funcionara. Creo que modifico el tercer argumento de la función Popen pero no puedo entender cómo hacerlo. Hay alguien que pueda ayudarme ???

Respuesta

5

No tiene que dividir el flujo/archivo en líneas usted mismo. Sólo iterar:

for ln in f: 
    # work on line in ln 

Esto debería funcionar igual de bien para archivos (usando open() para el archivo()) y tubos (utilizando Popen). Utilice la propiedad del objeto stdout popen para acceder a la tubería conectada a la salida estándar del subproceso

Ejemplo

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

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

Realmente no entiendo, yo debería escribir algo como para nextLine en Popen ([ 'ssh ', retList [0],' cd '+ retList [2] +'; cat '+ fileName], stdout = PIPE) .communicate() [0] en el FOR más externo de la función readLogs ??? – wheisenberg

+0

Utilice el atributo stdout para acceder al conducto. comunicarse no ayudará aquí. He actualizado mi respuesta con un ejemplo. – Ber

1

Retire el propio caudal y sólo tiene que utilizar el objeto de archivo.

para que el código sería el siguiente:

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

Ber tiene razón.

Para aclarar, el comportamiento de iteración predeterminado de un objeto de archivo es devolver la siguiente línea. así que "para nextLine en f" le dará los mismos resultados que "para nextLine en f.readlines()".

Consulte la documentación objeto de archivo para más detalles: http://docs.python.org/library/stdtypes.html#bltin-file-objects

Cuestiones relacionadas