2012-08-29 110 views
2

這裏有一個腳本,我使用的接收系統日誌,並將其附加到一個文本文件:Python腳本寫亂碼文件

# Receives packets on udp port 514 and 
# writes to syslog.txt 

from socket import * 

# Set the socket parameters 
host = "myhost" 
port = 514 
buf = 1024 
addr = (host,port) 

# Create socket and bind to address 
UDPSock = socket(AF_INET,SOCK_DGRAM) 
UDPSock.bind(addr) 

# Receive messages 
while 1: 
    data,addr = UDPSock.recvfrom(buf) 
    if not data: 
     print "Client has exited!" 
     break 
    else: 
     print "\nReceived message '", data,"'" 

     # This will create a new file or overwrite an existing file. 
     with open("C:\syslog.txt", "a") as myfile: 
      myfile.write(str(data)) 

# Close socket 
UDPSock.close() 

腳本工作正常,文本將被追加到文件。我看到它,它讀得很好。但是,當我關閉python時,該txt文件數據被轉換爲亂碼文本。任何想法爲什麼?在將套接字數據附加到文件之前,我應該做些什麼嗎?

謝謝。

+0

什麼文本編輯器,你在查看文件? –

+0

我正在查看它在記事本中。以下是我得到:ㄼ㈷䄾杵㈠<㐱㐺㨹㐱匠㕁〴嬠䥆䕒䅗䱌孝䥆䕒䅗䱌⁝晛物睥污嵬䰠䝏偟繸䕋孔剄偏⁝䤠㵎䅌⁎傳嘔匽䱅⁆剓㵃㤱⸲㘱⸸㠴㈮㘱䐠囈㈽㔵㈮㔵㈮㔵㈮㔵倠佒佔唽偄匠吶ㄽ㔷〰䐠吶ㄽ㔷〰㰀㜱㸲畁⁧㤲ㄠ㨴ㄵ㌺<䅓㐵‰䙛剉坅䱁嵌䙛剉坅䱁嵌嬠楦敲慷汬⁝ – PCKING

+0

嘗試不'STR()''左右data'。即打印>> myfile,數據 –

回答

4

你不是解析系統日誌數據包。系統日誌is a protocol;這不僅僅是純文本。數據字符很可能以文件結尾,這可能會導致某些自動字符檢測功能失效。

+0

我認爲str(數據)正在將數據包數據轉換爲字符串。如果情況並非如此,那麼我應該如何實施?我是python的新手。 – PCKING

+0

'data'已經是從套接字接收到的一串字節; 'str'不會進一步轉換它,也不期望它知道如何反彙編syslog數據包。你將不得不要麼實現日誌拆包在你的代碼或找到一個圖書館就像一個在這個答案建議這樣做:http://stackoverflow.com/a/12186092/722332 – zigg

0

我打算建議打開(「C:\ syslog.txt」,「at」)而不是打開(「C:\ syslog.txt」,「a」),但重新閱讀python dox ,文本是默認的(與C不同,我的內存說二進制是缺省的,這導致在Windows上運行時出現問題)。

我的另一個建議是把一個純文本頭在當你第一次創建該文件的頂部;不知道你使用的是什麼後讀取該文件,但記事本,寫字板用一些啓發式找出正在使用的UTF-8或其他編碼,並且我肯定見過情況下,失敗得很慘。 (搜索寫字板BOM猜測)

+0

我正在考慮使用的編解碼器進行解碼。爲此,我需要找出cisco syslog編碼格式。我會回來與我的研究:) – PCKING