Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.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 Set()中的某些元素最终变成了十六进制_Python_Csv_Parsing_Set - Fatal编程技术网

Python Set()中的某些元素最终变成了十六进制

Python Set()中的某些元素最终变成了十六进制,python,csv,parsing,set,Python,Csv,Parsing,Set,我试图将fortinet日志解析为csv文件。部分代码将读取日志文件中的所有400万行,并将“=”符号前的任何单词保存为set()中的元素。这些元素将成为csv标题 当试图解析500000行时,集合看起来不错,但是当我试图解析100万行时,一些元素开始变成长的十六进制值 附件是它最后的样子 C:\Python27>python.exe D:\parser\logtocsv.py * Finding Column Headers 2018-07-24 08:59:23 completed 1

我试图将fortinet日志解析为csv文件。部分代码将读取日志文件中的所有400万行,并将“=”符号前的任何单词保存为set()中的元素。这些元素将成为csv标题

当试图解析500000行时,集合看起来不错,但是当我试图解析100万行时,一些元素开始变成长的十六进制值

附件是它最后的样子

C:\Python27>python.exe D:\parser\logtocsv.py
* Finding Column Headers 2018-07-24 08:59:23
completed 1517027 lines
set(['', 'shapersentname', 'tuple-num', 'bandwidth', 'totalsession', 'disk', 'hook', 'HTTP/1.1in.css?ver', 'group', 'HTTP/1.13&ip', 'to',
'\xe7\xbf\xbb\xe4\xba\x86\xe5\x8d\x8a\xe5\xa4\xa9\xe6\x89\x8d\xe6\x89\xbe\xe5\x88\xb0\xe4\xbd\xa0\xef\xbc\x8cJia\xe6\x88\x91\xe5\xb8\xb8\xe7\x
94\xa8\xe6\x89\xa3\xe5\x8f\xb7706772123\xe5\x88\xab\xe5\x86\x8d\xe5\x88\xa0\xe6\x88\x91\xe5\x95\xa6~', 'HTTP/1.1?cms_redirect', 'analyticscksu
m', 'devname', 'setuprate', 'appact', 'fazlograte', 'recipient', 'sentpkt', 'shaperrcvdname', 'level', 'subtype', 'attackid', 'appid', 'dir',
'profile', 'sentbyte', 'crscore', 'duration', 'analyticssubmit', 'subject', 'error', 'eventtype', 'dstcountry', 'countweb', 'filename', 'diskl
ograte', 'applist', 'fcni', 'ref', 'method', 'mem', 'incidentserialno', 'processtime', 'reason', 'dstintf', 'srcintf', 'countav', 'sender', 'v
irusid', 'logid', 'HTTP/1.1ver', 'act', 'action', 'carrier_ep', 'policyid', 'dstip', 'rcvdbyte', 'srccountry', 'dtype', 'app', 'utmaction', 's
rcip', '\xe7\xbf\xbb\xe4\xba\x86\xe5\x8d\x8a\xe5\xa4\xa9\xe6\x89\x8d\xe6\x89\xbe\xe5\x88\xb0\xe4\xbd\xa0\xef\xbc\x8cJia\xe6\x88\x91\xe5\xb8\xb
8\xe7\x94\xa8\xe6\x89\xa3\xe5\x8f\xb7715859168\xe5\x88\xab\xe5\x86\x8d\xe5\x88\xa0\xe6\x88\x91\xe5\x95\xa6~', 'crlevel', 'shaperdropsentbyte',
 'rsso_key', 'from', 'log', 'service', 'fdni', 'devid', '\xe5\xbe\x88\xe5\xbc\x80\xe5\xbf\x83\xef\xbc\x8c\xe8\x83\xbd\xe6\x89\xbe\xe5\x88\xb0\
xe4\xbd\xa0\xef\xbc\x81Jia\xe4\xb8\x8b\xe6\x88\x91\xe5\xb8\xb8\xe7\x94\xa8q\xe5\x8f\xb7717598789\xe5\x88\xab\xe5\xbf\x98\xe4\xba\x86\xef\xbc\x
81', 'attack', 'filesize', 'logdesc', 'poluuid', 'msg', 'type', 'direction', 'authproto', 'sessionid', 'shaperdroprcvdbyte', 'countips', 'coun
t', 'datarange', 'cat', 'ui', 'countapp', 'rcvdpkt', 'quarskip', 'vd', 'craction', 'file', 'apprisk', 'severity', 'proto', 'hostname', 'new_st
atus', 'attachment', 'dstport', 'status', 'acct_stat', 'time', 'fsci', 'catdesc', 'virus', 'reporttype', 'user', 'reqtype', 'date', 'old_statu
s', 'countemail', 'url', 'appcat', 'srcport', 'command', 'trandisp', 'cpu'])
pause^A
下面是保存集合()中元素的代码部分:


您的问题是打印出UTF-8编码的字符串。例如,这:

'\xe7\xbf\xbb\xe4\xba\x86\xe5\x8d\x8a\xe5\xa4\xa9\xe6\x89\x8d\xe6\x89\xbe\xe5\x88\xb0\xe4\xbd\xa0\xef\xbc\x8cJia\xe6\x88\x91\xe5\xb8\xb8\xe7\x94\xa8\xe6\x89\xa3\xe5\x8f\xb7706772123\xe5\x88\xab\xe5\x86\x8d\xe5\x88\xa0\xe6\x88\x91\xe5\x95\xa6~'
…是此字符串的UTF-8编码:

翻了半天才找到你,Jia我常用扣号706772123别再删我啦~
您要做的是将UTF-8
str
字节字符串解码为
unicode
文本字符串


最干净的方法是尽早告诉文件对象本身为您解码。如果希望与Python2.6及更早版本兼容,或者希望与Python3兼容,则可以使用。无论哪种方式,您都会希望将字符串文本(如
“=”
)替换为unicode文本(如
u“=”
)。例如:

f = io.open(log_file_path, "r", encoding="utf-8")
# ...
current_col_header = u""
# ...
        if letter == u" ":
        # etc.

另一方面,最小的变化是尽可能晚地执行此操作,仅当您将内容存储在集合中时才手动解码:

col_headers.add(current_col_header.decode('utf-8')
…甚至更晚,当您打印内容时:

print {header.decode('utf-8') for header in col_headers}

第一种方法的好处是,如果要查找任何非ASCII字符,可以使用unicode字符串。例如,作为unicode的中文字符串中的第一个字母是
u'翻',所以如果字母==u,您可以执行
翻':;中文字符串中UTF-8的第一个字节是
'\xe7'
,因此如果字母=='翻':(如果字母='\xe7'
,则可以执行
,但这是不正确的,因为许多其他字符都以相同的
\xe7
字节开头)

但如果这永远不会成为问题,你可以用任何一种方式



作为补充说明,因为您在Windows上使用的是Python 2.7,所以尝试打印非ASCII字符串可能不起作用。有解决办法,但都很痛苦。简单的解决方案是切换到Python3。(事实上,在Python3中,您的整个问题从一开始就不会出现,因为文件会自动解码UTF-8,并且每个字符串都会自动成为Unicode字符串。)但是如果由于某种原因无法升级,您会遇到这个问题,您需要一种可怕的解决方法。

请在问题中发布实际文本,而不是txt的缩小屏幕截图。无论如何,在无法读取任何内容的情况下,我猜(大约2:1的概率)您实际拥有的是Python 2字符串或代表Unicode字符串的Python 3字节值,其中大部分是纯ASCII字符,但也有一些不是,因此,当您打印出UTF-8编码或拉丁语-1编码或cp1252编码或任何字节时,这些非ASCII字符显示为
\xc3\xa9
\xe9
,而不是
,您所需要做的就是使用正确的编码对
进行解码,以获得Python2 unicode或Python3字符串值。我还张贴了我的代码。我可以知道如何在这里添加解码吗?
print {header.decode('utf-8') for header in col_headers}