美文网首页
python3 处理xml文件与bcp文件

python3 处理xml文件与bcp文件

作者: Ziger丶 | 来源:发表于2020-03-02 14:55 被阅读0次

背景:收到数据包,里面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)

相关文章

网友评论

      本文标题:python3 处理xml文件与bcp文件

      本文链接:https://www.haomeiwen.com/subject/hsbcqhtx.html