2013-02-12 163 views
1

我在運行在debian服務器上的小型python腳本中遇到了一些問題。Python寫入文件

首先它應該做的:
- 從服務器列表 - >工作
- 轉換爲真正的字符串列表 - >工作
- 寫入文件 - >不做任何事...

已經嘗試在python接口(>>>)中使用相同的代碼,並且它按照它應該的方式寫入所有內容。
文件已經被創建並且獲得了一個chmod 777。
即使檢查如果沒有accidentially那素文字的另一實例正在運行的鎖定文件,但沒有...

任何人有一個想法,爲什麼開始,但在接口時,它不會寫文件?

而現在這裏的腳本本身:

#!/usr/bin/env python 

import urllib 
import sys 
import time 
import re 

exitNodes = [] 
readableNodes = [] 
class BlockTor(): 
    def getListFromWeb(myself): 
     url = "https://www.dan.me.uk/torlist/" 
     #url = "file:///E:/test.txt" 

     try: 
      for line in urllib.request.urlopen(url): 
       exitNodes.append(str(line, encoding='utf8')) 

      for node in exitNodes: 
       readableNodes.append(re.sub('\\n', '', node)) 
      #print(exitNodes) 
      #sys.exit() 
     except: 
      try: 
       f = open("/var/log/torblocker.log", "a") 
       #f = open("E:\\logfile.log", "a") 
       f.write("[" + time.strftime("%a, %d %b %Y %H:%M") + "] Error while loading new tornodes") 
       f.close() 
      except: 
       print("Can't write log") 
       pass 
      sys.exit() 
      pass 


    def buildList(myself): 
     f = open("/etc/apache2/torlist/tor-ip.conf", "w") 
     #f = open ("E:\\test-ips.conf", "w") 
     f.write('<RequireAll>\n') 
     f.write(' Require all granted\n') 
     for line in readableNodes: 
      f.write(' Require not ip ' + line + '\n') 
     f.write('</RequireAll>') 
     f.close() 
     try: 
      f = open("/var/log/torblocker.log", "a") 
      #f = open("E:\\logfile.log", "a") 
      f.write("[" + time.strftime("%a, %d %b %Y %H:%M") + "] Sucessfully updated tor blacklist") 
      f.close() 
     except: 
      pass 


    def torhandler(myself): 
     BlockTor.getListFromWeb(myself) 
     BlockTor.buildList(myself) 


if __name__ == "__main__": 
    asdf = BlockTor() 
    BlockTor.torhandler(asdf) 

編輯:
忘了提 - 如果你想測試小心:此服務器只允許一個請求的每個30分鐘

+3

請不要使用裸體'除了:'子句。他們很可能隱藏了你得到的例外。 – bernie 2013-02-12 18:23:54

+1

的確 - 我知道'except'子句應該設置爲寫入日誌文件,但是嘗試註釋掉所有'except'子句並只看看會發生什麼 – 2013-02-12 18:25:00

回答

7

來連接字符串,使用+操作。 &bitwise AND - 兩個字符串調用它會導致TypeError

>>> "[" & "" 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unsupported operand type(s) for &: 'str' and 'str' 

你的毯子except抑制了這個錯誤。與

with open("/var/log/torblocker.log", "a") as torf: 
    torf.write("[" + time.strftime("%a, %d %b %Y %H:%M") + "] " + 
       "Sucessfully updated tor blacklist") 

更換

try: 
    f = open("/var/log/torblocker.log", "a") 
    #f = open("E:\\logfile.log", "a") 
    f.write("[" & time.strftime("%a, %d %b %Y %H:%M") & "] Sucessfully updated tor blacklist") 
    f.close() #^         ^
except: 
    pass 

如果你想忽略時,文件無法寫入例外,圍繞與try .. except IOError:

+0

感謝您的提示(已經看到它但您發佈了之前我可以退出我的問題)。 但問題仍然存在,即使被替換的「&」字符和你的功能(打開...)它不會寫入它。 沒有錯誤給出,但在日誌文件或黑名單中幾乎沒有任何東西 – chill0r 2013-02-12 18:41:31

+0

很可能,您沒有足夠的權限訪問相關文件。嘗試刪除'嘗試..除了'看看你得到了什麼錯誤。如果您對錯誤不確定,請發佈一個新問題。 – phihag 2013-02-12 18:48:26

+0

這就是解決方案。我忘了將訪問權限設置爲輸出文件,因此無法寫入輸出文件 – chill0r 2013-02-12 19:01:37

2
f.write("[" & time.strftime("%a, %d %b %Y %H:%M") & "] Error while loading new tornodes") 

TypeError。要字符串字符串,使用+,而不是&。在這裏,您可以在except聲明中找到TypeError。這證明了爲什麼裸except陳述通常不是一個好主意。一般來說,只處理您所期望的錯誤並知道如何正確處理。

你也可以使用字符串格式化:

f.write('[{0}] Error while loading new tornodes'.format(time.strftime("%a, %d %b %Y %H:%M")))