Crossin的编程教室
标题:
读取log文件,然后解码出现问题了
[打印本页]
作者:
赵小雪
时间:
2017-7-28 16:11
标题:
读取log文件,然后解码出现问题了
data.access.zip
(1.28 KB, 下载次数: 1)
2017-7-28 16:01 上传
点击文件名下载附件
#问题描述:首先读取日志文件内容到log列表中,经在线测试知道日志编码为utf-8,然后将提取的部分字符串进行解码,出现了错误,尚未找到解决的办法!
import sys
import re
import json
# print(sys.getdefaultencoding())
path = 'D:\\Documents\\Tencent Files\\2247592847\\FileRecv\\log\\data.access.log'
file = open(path, 'r')
iter_f = iter(file)
#######生成log列表
log = []
for line in iter_f:
#print(line)
rowlist = list(line.strip().split('"'))
log.append(rowlist)
# for i in range(len(log)):
# string = log
[3]
# #re.sub()
# print('1:',string)
#
# str_before = bytes((ord(i) for i in string)).decode('utf-8')
# print('2:',str_before)
# #json 解析
# str_after = json.loads(str_before)
# #提取关键字
# appProfile, deviceProfile, events = extract_keywords(str_after)
# for之前先测试一下
string = log[0][3]
print('1:',string)
str_before = bytes((ord(i) for i in string)).decode('utf-8')
print('2:',str_before)
2017-7-28 16:09 上传
下载附件
(23.23 KB)
目测是str_before那行decode没有成功。我该怎么办,急求呀。
作者:
crossin先生
时间:
2017-7-28 21:36
别目测啊,代码里报错在那一行都给你写出来了,36行,json.loads(str_before)
(所以你上面这个代码和你运行的代码不是一个,这里是你后注释掉的)
而且这里你自己也已经print出来出错的变量了,它不是个合法 json 字符串。错误就在 \x22 这里。\x22 理应是个双引号才对
作者:
crossin先生
时间:
2017-7-28 21:38
原因就是str_before未解码
所以你应该改成
str_before = str_before.decode('utf8')
str_after = json.loads(str_before)
复制代码
关于编码不是一两句能说清,公众号回复 编码,把几篇文章写看看,再搜搜相关材料理解下
作者:
crossin先生
时间:
2017-7-28 22:18
不好意思,我又看了下你的log文件,发现这还真是个大坑。我只能说,生成这个log文件的代码写的并不好,把bytes当成str来保存。(说明对编码的理解有问题)
而这个问题在python3里不太好解决。
解释起来有点麻烦,我尝试了很久,给你一个解决方案:
import codecs
with open('data.access.log', 'rb') as f:
s=f.read()
b=codecs.escape_decode(s)[0]
result = b.decode('utf8')
复制代码
欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/)
Powered by Discuz! X2.5