2009-03-16 34 views
6

Tôi mới làm quen với lập trình python. Tôi có vấn đề này: Tôi có danh sách các tệp văn bản (cả nén và không) và tôi cần: - kết nối với máy chủ và mở chúng - sau khi mở tệp, tôi cần lấy nội dung và thông tin của mình nó đến một hàm python khác mà tôi đã viếtPython, chuyển hướng dòng Popen đến hàm 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 

để xây dựng thông tin chứa trong các tệp đó. Chức năng này có mục đích viết chỉ 1 dòng nhật ký được lưu trữ trong các tệp đó bằng 3 dòng ... Chức năng này hoạt động tốt trên các tệp đọc từ máy cục bộ của tôi nhưng tôi không thể tìm ra cách kết nối với máy chủ từ xa và tạo ra những bản ghi một dòng mà không cần lưu trữ các nội dung của mỗi tập tin vào một chuỗi và sau đó làm việc với chuỗi ... lệnh mà tôi sử dụng để kết nối với máy tính từ xa là:

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

retList [0] và danh sách phát [2] là tên người dùng @ từ xa và tên thư mục mà tôi phải truy cập

Nhờ tất cả trước!

UPDATE:

Vấn đề của tôi là tôi phải thiết lập một kết nối ssh đầu tiên:

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

Tất cả các tập tin mà tôi cần phải mở được lưu trữ trong một danh sách, filelist [], một phần của chúng được nén (.gz) và một phần chỉ là các tập tin văn bản !! Tôi đã thử tất cả các thủ tục mà u cho thấy trước khi bot không có gì làm việc ... Tôi nghĩ rằng tôi mus sửa đổi các đối số thứ ba của chức năng Popen nhưng tôi không thể tìm ra cách để làm điều đó! Có ai có thể giúp tôi không ???

Trả lời

5

Bạn không phải tự tách dòng/tệp thành các dòng. Chỉ cần lặp lại:

for ln in f: 
    # work on line in ln 

Điều này sẽ hoạt động tốt như nhau đối với tệp (sử dụng mở() cho tệp()) và đường ống (sử dụng Popen). Sử dụng các stdout tài sản của đối tượng popen để truy cập các đường ống kết nối với thiết bị xuất chuẩn của tiến trình con

Ví dụ

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

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

Tôi thật sự không hiểu, tôi nên viết một cái gì đó giống như cho nextLine trong Popen ([ 'ssh ', retList [0],' cd '+ retList [2] +'; cat '+ tên tệp], stdout = PIPE) .communicate() [0] trong FOR bên ngoài nhất của hàm readLogs ??? – wheisenberg

+0

Sử dụng thuộc tính stdout để truy cập vào đường ống. giao tiếp sẽ không giúp ích gì ở đây. Tôi đã cập nhật câu trả lời của mình bằng một ví dụ. – Ber

1

Di chuyển trong luồng và chỉ sử dụng các đối tượng tập tin.

Vì vậy mà mã của bạn sẽ đọc:

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

Ber có nó ngay.

Để làm rõ, hành vi lặp lại mặc định của đối tượng tệp là trả về dòng tiếp theo. do đó "cho nextLine trong f" sẽ cho bạn kết quả tương tự như "cho nextLine trong f.readlines()".

Xem tài liệu đối tượng tập tin để biết chi tiết: http://docs.python.org/library/stdtypes.html#bltin-file-objects

Các vấn đề liên quan