Pergunta

Eu sou novo em programação python. Eu tenho esse problema: Eu tenho uma lista de arquivos de texto (tanto comprimido e não) e eu preciso: - conectar ao servidor e abri-los - após a abertura do arquivo, eu preciso tomar o seu conteúdo e passá-lo para outra função python que escrevi

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

a fim de elaborar a informação contida nesses arquivos. A função tem o objetivo de gravação em apenas 1 linha os registros que são armazenados nesses arquivos usando 3 linhas ... A função está funcionando bem em arquivos lidos da minha máquina local, mas eu não consigo descobrir como se conectar a um servidor remoto e criar esses logs de uma linha sem armazenar o conteúdo de cada arquivo em uma string e, em seguida, trabalhar com a corda ... o comando que eu uso para se conectar à máquina remota é:

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

retList [0] e retList [2] é o usuário @ remoto e o nome da pasta que tenho de acesso

Obrigado a todos antecipadamente!

UPDATE:

O meu problema é que eu tenho que estabelecer uma conexão ssh primeiro:

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

Todos os arquivos que eu preciso abrir são armazenados em uma lista, fileList [], parte delas são compactados (.gz) e parte são apenas arquivos de texto !! Eu tentei todos os procedimentos que u mostrou antes bot nada funcionou ... Eu acho que eu mus modificar o terceiro argumento da função Popen mas eu não consigo descobrir como fazê-lo! Existe alguém que pode me ajudar ???

Foi útil?

Solução

Você não tem que separar a corrente / arquivo em linhas de si mesmo. Apenas iterate:

for ln in f:
    # work on line in ln

Isso deve funcionar igualmente bem para arquivos (usando open () para o arquivo ()) e tubos (usando Popen). Use a propriedade stdout do objeto popen ao acesso do tubo conectado a stdout do subprocesso

Exemplo

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

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

Outras dicas

Remova InStream e usar apenas o objeto de arquivo.

Assim que o código seria:

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

Ber tem direito.

Para esclarecer, o comportamento iteração padrão de um objeto de arquivo é retornar a próxima linha. por isso " para nextLine em f " irá dar-lhe os mesmos resultados como " para nextLine em f.readlines () ".

Consulte a documentação do objeto de arquivo para obter mais detalhes: http: // docs .python.org / biblioteca / stdtypes.html # bltin-file-objetos

Se você quer fazer algo via ssh, por que não usar o Python SSH módulo ?

Tente esta página, melhor informação sobre popen eu encontrei até agora ....

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top