Crossin的编程教室

标题: 读取log文件,然后解码出现问题了 [打印本页]

作者: 赵小雪    时间: 2017-7-28 16:11
标题: 读取log文件,然后解码出现问题了
data.access.zip (1.28 KB, 下载次数: 1)

#问题描述:首先读取日志文件内容到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)

微信图片_20170728160839.png
目测是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未解码
所以你应该改成
  1. str_before = str_before.decode('utf8')
  2. str_after = json.loads(str_before)
复制代码
关于编码不是一两句能说清,公众号回复 编码,把几篇文章写看看,再搜搜相关材料理解下
作者: crossin先生    时间: 2017-7-28 22:18
不好意思,我又看了下你的log文件,发现这还真是个大坑。我只能说,生成这个log文件的代码写的并不好,把bytes当成str来保存。(说明对编码的理解有问题)
而这个问题在python3里不太好解决。
解释起来有点麻烦,我尝试了很久,给你一个解决方案:
  1. import codecs
  2. with open('data.access.log', 'rb') as f:
  3.     s=f.read()
  4. b=codecs.escape_decode(s)[0]
  5. result = b.decode('utf8')
复制代码





欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5