最近在解析数据,悲催遇到错误手动退出,于是数据库没存储上。于是只能从日志里提取数据再存到数据库。
例如:
[2018-05-23 18:09:36] [DEBUG] 5 : ('\xe6\xb1\x9f\xe8\x8b\x8f\xe7\x9c\x81\xe5\xb9\xbf\xe6\x92\xad\xe7\x94\xb5\xe8\xa7\x86\xe6\x80\xbb\xe5\x8f\xb0', '\xe4\xba\x8b\xe4\xb8\x9a\xe5\x8d\x95\xe4\xbd\x8d', '\xe6\xb1\x9f\xe8\x8b\x8f\xe7\xbd\x91\xe7\xbb\x9c\xe7\x94\xb5\xe8\xa7\x86\xe5\x8f\xb0-\xe9\x9d\x9e\xe8\xaf\x9a\xe5\x8b\xbf\xe6\x89\xb0', 110L)
用open读取出来每一行后,怎么处理都显示不成中文。
后来发现是从文件中读取的内容是,中文的编码变成了字符串格式了。
>>> a=f.readline()
>>> a
"[2018-05-23 18:09:12] [DEBUG] 1 : ('\\xe6\\xb1\\x9f\\xe8\\x8b\\x8f\\xe7\\x9c\\x81\\xe5\\xb9\\xbf\\xe6\\x92\\xad\\xe7\\x94\\xb5\\xe8\\xa7\\x86\\xe6\\x80\\xbb\\xe5\\x8f\\xb0', '\\xe4\\xba\\x8b\\xe4\\xb8\\x9a\\xe5\\x8d\\x95\\xe4\\xbd\\x8d', '\\xe6\\xb1\\x9f\\xe8\\x8b\\x8f\\xe7\\xbd\\x91\\xe7\\xbb\\x9c\\xe7\\x94\\xb5\\xe8\\xa7\\x86\\xe5\\x8f\\xb0-\\xe9\\x9d\\x9e\\xe8\\xaf\\x9a\\xe5\\x8b\\xbf\\xe6\\x89\\xb0', 110L)\r\n"
>>> print a
[2018-05-23 18:09:12] [DEBUG] 1 : ('\xe6\xb1\x9f\xe8\x8b\x8f\xe7\x9c\x81\xe5\xb9\xbf\xe6\x92\xad\xe7\x94\xb5\xe8\xa7\x86\xe6\x80\xbb\xe5\x8f\xb0', '\xe4\xba\x8b\xe4\xb8\x9a\xe5\x8d\x95\xe4\xbd\x8d', '\xe6\xb1\x9f\xe8\x8b\x8f\xe7\xbd\x91\xe7\xbb\x9c\xe7\x94\xb5\xe8\xa7\x86\xe5\x8f\xb0-\xe9\x9d\x9e\xe8\xaf\x9a\xe5\x8b\xbf\xe6\x89\xb0', 110L)
可见存储成字符串了,找了好多文章,大多数都是说编码转换的问题,其他语言有直接转换的函数,想找一个python的找不到。后来想到了十六进制转换的问题,于是找了一下相关函数,自己写了一个处理方式。
>>> ss="e88b8f".decode('hex')
>>> ss
'\xe8\x8b\x8f'
>>> print ss
苏
写了个函数处理(并没有考虑多种特殊情况,例如\x1234或者\x12\x56aaa等等这样的):
def str_to_zhongwen(var): print "str_to_zhongwen : ",var not_end = True while not_end: start1 = var.find("\\x") if start1>-1: str1=var[start1+2:start1+4] start2 = var[start1+4:].find("\\x")+start1+4 if start2>-1: str2=var[start2+2:start2+4] start3 = var[start2+4:].find("\\x")+start2+4 if start3>-1: str3=var[start3+2:start3+4] else: not_end = False if start1>-1 and start2>-1 and start3>-1: str_all=str1+str2+str3 str_all = str_all.decode('hex') str_re = var[start1:start3+4] print str_all, " " ,str_re var = var.replace(str_re,str_all) print var.decode('utf-8') return var>>> a="\\xe6\\xb1\\x9f\\xe8\\x8b\\x8f\\xe7\\x9c\\x81\\xe5\\xb9\\xbf\\xe6\\x92\\xad\\xe7\\x94\\xb5\\xe8\\xa7\\x86\\xe6\\x80\\xbb\\xe5\\x8f\\xb0"