背景:收到数据包,里面xml文件中包含数据文件信息,bcp文件包含数据,需要将文件存入数据库。
目标:处理xml文件与bcp文件,转化成dataframe的格式。
1、查看数据
解压后数据如下:
数据样例
2、处理xml文件
先打开查看XML文件,其中我们所需要的仅仅是数据字段名称,如下所示:
所需字段
所以使用lxml来直接解析,选取好要获得的子节点路径。可以参考lxml库的使用方法。
import os
from lxml import etree
import lxml.html
import pandas as pd
import datetime
def Xml_to_txt (xml_path):
html = etree.parse(xml_path,etree.HTMLParser())
result = html.xpath(r'//data/dataset/data/dataset[@name="ZA_DATA_STRUCT"]/data/item/@key')
return (result)
result = Xml_to_txt (r'C:\Users\Administrator\Desktop\Test\ZAGL_ZIP_INDEX.xml')
print (result)
#[jrptbm , ygbm , zp ,djsj]
结果result就是所需标签的列表。
3、处理bcp文件
先打开查看bcp文件,共4列,无表头。如下所示:
bcp文件样式
先读取文件,将其中的空格字符去掉,一行一行的读取成包含4个字符串的小列表,然后将列表集中转化成dataframe。
def Bcp_to_txt(bcp_path):
with open(bcp_path,'r',encoding = 'UTF-8') as f:
a = f.read()
b = a.split('\n')
b.remove('')
data_list =[]
for i in b:
data_list.append([j.strip() for j in [i.split('\t')][0]])
c = pd.DataFrame(data_list)
return (c)
bcp_path = r'C:\Users\Administrator\Desktop\Test\510000-409010004-20200221050012-00003.bcp'
data = Bcp_to_txt(bcp_path)
4、批量处理
直接输入文件夹地址,一次性读取出表头名称(xml文件)与数据内容(4个bcp文件)。
def Read_file (file):
#读取文件路径下的所有文件路径与文件名称
file_list = []
name_list = []
try:
for i in os.listdir(file):
j = file + '/' + i
file_list.append(j)
name_list.append(i)
except:
print ('read fail')
return (file_list,name_list)
def Data_to_dataframe(file_path):
all_path , b_path = Read_file (file_path)
#处理两种文件的地址
all_xml_path = [i for i in all_path if '.xml' in i]
all_bpc_path = [i for i in all_path if '.bcp' in i]
#获取数据列名称
xml_path = all_xml_path[0]
col_name = Xml_to_txt (xml_path)
#将bcp数据统计转化成dataframe
all_data_zip = [] #当前压缩包中所有数据
for i in all_bpc_path:
all_data_zip.append(Bcp_to_txt(i))
all_data = pd.concat(all_data_zip,axis = 0)
all_data = all_data.reset_index(drop = True)
#修改列名称
all_data.columns = col_name
#将登记时间字段转化成时间格式
try:
all_data['djsj'] = pd.to_datetime(all_data['djsj'])
except:
pass
return (all_data)
if __name__ =="__main__" :
file_path = r'C:\Users\Administrator\Desktop\Test'
all_data = Data_to_dataframe(file_path)







网友评论