Pregunta

Soy nuevo en la programación de Python. Tengo este problema: tengo una lista de archivos de texto (tanto comprimidos como no) y necesito: - conéctese al servidor y ábralos - después de abrir el archivo, necesito tomar su contenido y pasarlo a otra función de Python que escribí

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 los archivos leídos desde mi máquina local, pero no puedo entender cómo conectarme a un servidor remoto y cree estos registros de una línea sin almacenar el contenido de cada archivo en una cadena y luego trabajar con la cadena ... El comando que utilizo para conectarme 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 @ remoto y el nombre de la carpeta a la que tengo que acceder

¡Gracias a todos de antemano!

UPDATE:

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

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

¡Todos los archivos que necesito abrir están almacenados 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 debo modificar el tercer argumento de la función Popen pero no puedo entender cómo hacerlo! ¿Hay alguien que pueda ayudarme?

¿Fue útil?

Solución

No tiene que dividir la secuencia / archivo en líneas usted mismo. Solo itera:

for ln in f:
    # work on line in ln

Esto debería funcionar igualmente bien para archivos (usando open () para archivo ()) y tuberías (usando Popen). Utilice la propiedad stdout del objeto popen para acceder a la tubería conectada a stdout del subproceso

Ejemplo

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

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

Otros consejos

Elimine InStream y simplemente use el objeto de archivo.

Para que su código lea:

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. entonces " para nextLine en f " le dará los mismos resultados que " para nextLine en f.readlines () " ;.

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

Si desea hacer algo a través de ssh, ¿por qué no usar el módulo Python SSH ?

Pruebe esta página, la mejor información sobre popen que he encontrado hasta ahora ...

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top