遇见的问题及解决方法:
关于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")