设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 14456|回复: 3
打印 上一主题 下一主题

读取log文件,然后解码出现问题了

[复制链接]

2

主题

0

好友

18

积分

新手上路

Rank: 1

跳转到指定楼层
楼主
发表于 2017-7-28 16:11:20 |只看该作者 |倒序浏览
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没有成功。我该怎么办,急求呀。





回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

沙发
发表于 2017-7-28 21:36:32 |只看该作者
别目测啊,代码里报错在那一行都给你写出来了,36行,json.loads(str_before)
(所以你上面这个代码和你运行的代码不是一个,这里是你后注释掉的)

而且这里你自己也已经print出来出错的变量了,它不是个合法 json 字符串。错误就在 \x22 这里。\x22 理应是个双引号才对
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

板凳
发表于 2017-7-28 21:38:01 |只看该作者
原因就是str_before未解码
所以你应该改成
  1. str_before = str_before.decode('utf8')
  2. str_after = json.loads(str_before)
复制代码
关于编码不是一两句能说清,公众号回复 编码,把几篇文章写看看,再搜搜相关材料理解下
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

地板
发表于 2017-7-28 22:18:03 |只看该作者
不好意思,我又看了下你的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的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-22 22:29 , Processed in 0.024562 second(s), 26 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部