将blob数据中的十六进制转化为字符串

2020-01-30

利用python将Oracle数据库导出的blob字段,从十六进制转化为文本,并写入xml文本中

遇见的问题及解决方法:

关于Oracle数据库 blob字段内容导出问题,大家肯定都百度了不少知识,而这一次,我碰到了个新问题,别人给了我一些blob导出的十六进制数据,让我帮忙转化成文本,经过不懈的百度,还是解决了这个问题,特此记录一下,大家有好的办法也可以评论,互相学习。

给大家看下数据哦 在这里插入图片描述 在这里插入图片描述 密密麻麻的恐怖如斯,然后放上我的代码:

在这里插入图片描述

说下思路: 利用xlrd 去访问excel,首先是打开文件 独取对应的表。我们所需要的数据在第三列,起始位置有效位置是第二行

list = table.col(colx=2 , start_rowx=1 , end_rowx=None)

拿到数据以后我们打印一下会发现,有开头是Number的 有的是text,这里我们只需要text的

str(li).startswith('text')

拿到真正需要处理的数据后,就要开始搞事情了,不过有个条件,我们来看下:

def unhexlify(hexstr): # known case of binascii.unhexlify
    """
    Binary data of hexadecimal representation.
    
    hexstr must contain an even number of hex digits (upper or lower case).
    """
    return b""

这里我们看见人家定义的方法,声明需要偶数的十六进制数字,我们得需要进行一点处理,将“0x”去掉。然后保证数值是偶数个,然后进行方法调用。

hex = str(li)[8:-1]
if(len(hex)%2 != 0):
            hex = hex[0:-1]

        txt = binascii.unhexlify(hex)

得到了想要的结果,就只需要进行指定格式保存了,给大家看下效果

在这里插入图片描述 在这里插入图片描述

下面贴出完整代码供大家参考:

import binascii
import xlrd
data = xlrd.open_workbook('病历.xlsx')
table = data.sheets()[0]  #通过索引顺序获取表

list = table.col(colx=2 , start_rowx=1 , end_rowx=None)

#print(len(list))
di = 0

for li in list:
    #print(str(li))
    if(str(li).startswith('text')):

        hex = str(li)[8:-1]

        print(len(hex))   #打印长度
        print(hex) #打印数据

        if(len(hex)%2 != 0):
            hex = hex[0:-1]

        txt = binascii.unhexlify(hex)
        print(txt)

        with open('内容//'+ str(di) +'.xml' , 'wb')as f:
            f.write(txt)
        di = di+1
print("done")