2013-10-17 169 views
0

我的python程序通過ssh獲取郵件日誌數據。當我嘗試去在每行它符合Python打開文件錯誤

with text as f: 
    for line in f: 
     try: 
      .... regex stuff.... 

我得到的錯誤:

Traceback (most recent call last): 
    File "xxxxxxxxxxxxxxxxxxxxxxxx", line 90, in <module> 
    start() 
    File "xxxxxxxxxxxxxxxxxxxxxxxx", line 64, in start 
    with text as f: 
AttributeError: __exit__ 

這並不工作,這工作對我來說唯一的解決辦法如下。將文本保存爲文件並再次打開時。但該文件大約1.24 MB,這會不必要地降低程序速度。任何人都知道我可以如何擺脫額外的儲蓄?

.... 
stdin, stdout, stderr = ssh.exec_command('sudo cat /var/log/mailing.log') 
text = ''.join(stdout.readlines()) 
text_file = open('mail.log', 'w') 
text_file.write(text) 
text_file.close() 
ssh.close() 

with open('mail.log') as f: 
    for line in f: 
     try: 
      .... regex stuff.... 
+1

'text'是不是一個上下文管理器,你爲什麼試圖把它當作這樣?你原來的代碼中*是什麼*「text」? –

+0

'ssh.exec_command()'從哪裏來? –

+0

var'text'是文件'mailing.log'中的所有文本。我想我不明白上下文管理器的概念....'ssh.exec_command()'來自我使用的模塊paramiko。 – gulden

回答

1

text是一個帶有數據的字符串。你無法打開它。相反,打開它你應該只循環了它

for line in text.splitlines(): 
    try: 
     .... regex stuff.... 
+0

也看看'str.splitlines()'。 –

+0

@MartijnPieters不知道splitlines(),我通常使用split(os.sep)。我現在改了它。謝謝! –

+0

非常感謝,完美的作品! – gulden

1

你可能想看看StringIO的標準庫中,這使得一個字符串看起來或多或少像一個文件。

或者,你可以只說

for line in f.split('\n'): 
    try: 
     <regex stuff>