python读取文件里中文编码后的字符串(\\xe6\\xb1\\x9f)中文转换的问题

最近在解析数据,悲催遇到错误手动退出,于是数据库没存储上。于是只能从日志里提取数据再存到数据库。

例如:

[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"
>>> 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'
>>> print 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
>>> str_to_zhongwen(a)
str_to_zhongwen :  \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
江     \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
江苏省广播电视总台
'\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'

你可能感兴趣的:(Python)