遇見的問題及解決方法:
關於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")