2009-03-16 3 views
6

Я новичок в программировании на питоне. У меня есть эта проблема: у меня есть список текстовых файлов (как сжатых, так и не), и мне нужно: - подключиться к серверу и открыть их - после открытия файла мне нужно взять его содержимое и передать это к другой функции python, которую я написалPython, перенаправляющий поток Popen на функцию python

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 

, чтобы уточнить информацию, содержащуюся в этих файлах. Функция предназначена для записи всего в 1 строке журналов, которые хранятся в этих файлах, используя 3 строки ... Функция отлично работает с файлами, считываемыми с моей локальной машины, но я не могу понять, как подключиться к удаленному серверу и создать эти журналы одну строку без сохранения содержания каждого файла в строку, а затем работать со строкой ... команда, которую я использую для подключения к удаленной машине:

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

retList [0] и retList [2] являются пользователем @ remote и именем папки, которое мне нужно получить

Спасибо всем!

UPDATE:

Моя проблема заключается в том, что я должен установить соединение SSH первый:

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

Все файлы, которые мне нужно открыть, хранятся в списке, FileList [], часть из них сжата (.gz), а часть - только текстовые файлы! Я пробовал все процедуры, которые вы показали до того, как бот ничего не работал ... Я думаю, что я изменил третий аргумент функции Popen, но я не могу понять, как это сделать! Есть ли кто-нибудь, кто может мне помочь?

ответ

5

Вам не нужно разделить поток/файл на линии самостоятельно. Просто итерация:

for ln in f: 
    # work on line in ln 

Это должно работать одинаково хорошо для файлов (с использованием открытого() для файла()) и труб (с использованием POPEN). Используйте stdout свойство POPEN объекта для доступа к трубе, подсоединенной на стандартный вывод подпроцесса

Пример

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

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

Я действительно не понимаю, что я должен написать что-то вроде для nextLine в Popen ([ 'SSH ', retList [0],' cd '+ retList [2] +'; cat '+ fileName], stdout = PIPE) .communicate() [0] в самом внешнем FOR функции readLogs ??? – wheisenberg

+0

Используйте атрибут stdout для доступа к каналу. Общение здесь не поможет. Я обновил свой ответ на примере. – Ber

1

Удалить и просто-Stream использовать объект файла.

Так что ваш код будет гласить:

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

Бер имеет это право.

Чтобы уточнить, поведение итерации по умолчанию для файлового объекта заключается в возврате следующей строки. так что "для nextLine in f" даст вам тот же результат, что и "для nextLine в f.readlines()".

См объектную документацию файла для деталей: http://docs.python.org/library/stdtypes.html#bltin-file-objects

0

Если вы хотите сделать что-то через SSH, то почему бы не использовать the Python SSH module?

Смежные вопросы