Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python脚本将乱码写入文件_Python_Sockets_Udp_Syslog - Fatal编程技术网

Python脚本将乱码写入文件

Python脚本将乱码写入文件,python,sockets,udp,syslog,Python,Sockets,Udp,Syslog,下面是我用来接收syslog并将其附加到文本文件的脚本: # 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 = sock

下面是我用来接收syslog并将其附加到文本文件的脚本:

# 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文件数据就被翻译成乱七八糟的文本。你知道为什么吗?在将套接字数据附加到文件之前,是否应该执行其他操作


谢谢。

您没有解析系统日志数据包。系统日志;这不仅仅是纯文本。数据字符最有可能出现在您的文件中,这可能会使一些自动字符检测出现问题。

我打算建议使用open(“C:\syslog.txt”、“at”)而不是open(“C:\syslog.txt”、“a”),但是重新读取python dox时,文本是默认值(与C不同,我的记忆告诉我二进制是默认值,这会导致在windows上运行时出现问题)


我的另一个建议是,在您第一次创建文件时,在文件的顶部放置一个纯文本标题;不确定您在之后使用什么来读取文件,但记事本和写字板使用一些启发式方法来确定使用了什么UTF-8或其他编码,我肯定见过这种情况严重失败的情况。(搜索写字板BOM猜测)

这可能直接实现您想要实现的目标(解析syslog协议并转储它):

您在哪个文本编辑器中查看文件?我在记事本中查看。以下是我得到的:ㄼ㈷䄾杵㈠‹㐱㐺㨹㐱匠㕁〴嬠䥆䕒䅗䱌孝䥆䕒䅗䱌⁝晛物睥污嵬䰠䝏偟䍁䕋孔剄偏⁝䤠㵎䅌⁎传呕匽䱅⁆剓㵃㤱⸲㘱⸸㠴㈮㘱䐠呓㈽㔵㈮㔵㈮㔵㈮㔵倠佒佔唽偄匠呐ㄽ㔷〰䐠呐ㄽ㔷‌​〰㰀㜱㸲畁⁧㤲ㄠ㨴ㄵ㌺‹䅓㐵‰䙛剉坅䱁嵌䙛剉坅䱁嵌嬠楦敲慷汬⁝在
数据
周围尝试不使用
str()
。例如,打印>>我的文件,数据我认为str(数据)正在将数据包转换为字符串。如果不是这样,那么我应该如何实现这一点?我是python新手。
数据
已经是从套接字接收到的一个字节字符串;
str
将不会进一步转换它,也不合理地期望它知道如何反汇编系统日志数据包。您必须实现sy在您的代码中进行数据包反汇编,或者找到一个类似于此答案中建议的库来执行此操作:我正在考虑使用编解码器对其进行解码。为此,我需要找到cisco syslog编码格式。我将返回我的研究:)