Navicat工具实现
可以用Navicat连上sqlite数据库,导入spfwssflbm.xml到sqlite3数据库里面再导出表格代码实现
直接解析gbk编码的xml文件
tree = ET.parse('spfwssflbm.xml')
root = tree.getroot()
需要
1、将C:\Program Files (x86)\开票软件\税号.分机号\Bin下的商品服务税收分类编码spfwssflbm.xml文件放到当前终端下,并用记事本打开另存为utf-8格式2、首行<?xml version="1.0" encoding="gbk"?>中的编码gbk改为utf-8,不然xml.etree.ElementTree无法解析中文报错
spfwssflbm.xml |
参考资料
http://blog.appliedinformaticsinc.com/how-to-parse-and-convert-xml-to-csv-using-python/
https://docs.python.org/3/library/xml.etree.elementtree.html
https://python3-cookbook.readthedocs.io/zh_CN/latest/c06/p03_parse_simple_xml_data.html
环境
python3.7.2
jupyter notebook、vscode、PyCharm、Thonny上验证通过
excel to dict
- import pandas as pd
- my_dic = pd.read_excel(r'C:\Users\DZL\Desktop\spfwssflbm.xlsx', index_col=0).to_dict()
- print(my_dic)
代码如下
- import xml.etree.ElementTree as ET
- import csv
- import pandas as pd
- # 字段中英文对照
- dic = {'BB': '版本',
- 'QYSJ': '启用时间',
- 'GDQJZSJ': '过渡期截止时间',
- 'SPBM': '商品编码',
- 'SPMC': '商品名称',
- 'SPBMJC': '商品编码简称',
- 'SM': '说明',
- 'ZZSSL': '增值税税率',
- 'GJZ': '关键字',
- 'HZX': '是否汇总项',
- 'KYZT': '可用状态',
- 'ZZSTSGL': '增值税特殊管理',
- 'ZZSZCYJ': '增值税政策依据',
- 'ZZSTSNRDM': '增值税特殊内容代码',
- 'XFSGL': '消费税管理',
- 'XFSZCYJ': '消费税政策依据',
- 'XFSTSNRDM': '消费税特殊内容代码',
- 'TJJBM': '统计局编码',
- 'HGJCKSPPM': '海关进出口商品品目',
- 'PID': 'PID',
- 'GXSJ': '更新时间'}
- # tree = ET.parse('spfwssflbm.xml')
- # root = tree.getroot()
- # 避免直接解析gbk编码的xml文件报错
- with open('spfwssflbm.xml', 'rb') as f:
- root = ET.fromstring(f.read().decode('gbk', 'ignore'))
- # newline=''防止生成空白行, encoding='utf_8_sig'自动转码
- with open('spfwssflbm.csv', 'w', newline='', encoding='utf_8_sig') as flbm_data:
- csvwriter = csv.writer(flbm_data)
- # 添加标题行
- flbm_head = []
- for i in dic.values():
- flbm_head.append(i)
- csvwriter.writerow(flbm_head)
- for bmxx in root.findall('body/BMXX'):
- # 添加内容
- flbm_body = []
- for j in dic.keys():
- flbm_body.append(bmxx.find(j).text)
- csvwriter.writerow(flbm_body)
- df = pd.read_csv('spfwssflbm.csv', index_col=False)
- # 避免版本丢失小数点, 商品编码、PID变成科学计数法
- df['版本'] = df['版本'].apply(lambda x: '{:.1f}'.format(float(x)))
- df['商品编码'] = df['商品编码'].apply(lambda x: '{:d}'.format(int(x)))
- df['PID'] = df['PID'].apply(lambda x: '{:d}'.format(int(x)))
- df.to_excel('spfwssflbm.xlsx',index=False)
import xml.etree.ElementTree as ET
import csv
tree = ET.parse('spfwssflbm.xml')
root = tree.getroot()
#open() 函数用于打开一个文件,创建一个 file 对象
#Flbm_data = open('spfwssflbm.csv', 'w')
#newline=''防止生成空白行,encoding='utf_8_sig'自动转码
with open('spfwssflbm.csv', 'w', newline='', encoding='utf_8_sig') as Flbm_data:
csvwriter = csv.writer(Flbm_data)
flbm_head = []
count = 0
for bmxx in root.findall('body/BMXX'):
flbm = []
if count == 0:
#字符串相加,组成表头
spbm = '商品编码(' + bmxx.find('SPBM').tag + ')'
flbm_head.append(spbm)
bb = '版本号(' + bmxx.find('BB').tag + ')'
flbm_head.append(bb)
spmc = '商品名称(' + bmxx.find('SPMC').tag + ')'
flbm_head.append(spmc)
spbmjc = '商品编码简称(' + bmxx.find('SPBMJC').tag + ')'
flbm_head.append(spbmjc)
kyzt = '可用状态(' + bmxx.find('KYZT').tag + ')'
flbm_head.append(kyzt)
hzx = '是否大类(' + bmxx.find('HZX').tag + ')'
flbm_head.append(hzx)
zzssl = '税率(' + bmxx.find('ZZSSL').tag + ')'
flbm_head.append(zzssl)
gjz = '关键字(' + bmxx.find('GJZ').tag + ')'
flbm_head.append(gjz)
sm = '说明(' + bmxx.find('SM').tag + ')'
flbm_head.append(sm)
csvwriter.writerow(flbm_head)
count = count + 1
spbm = bmxx.find('SPBM').text
flbm.append(spbm)
bb = bmxx.find('BB').text
flbm.append(bb)
spmc = bmxx.find('SPMC').text
flbm.append(spmc)
spbmjc = bmxx.find('SPBMJC').text
flbm.append(spbmjc)
kyzt = bmxx.find('KYZT').text
flbm.append(kyzt)
hzx = bmxx.find('HZX').text
flbm.append(hzx)
zzssl = bmxx.find('ZZSSL').text
flbm.append(zzssl)
gjz = bmxx.find('GJZ').text
flbm.append(gjz)
sm = bmxx.find('SM').text
flbm.append(sm)
csvwriter.writerow(flbm)
#with用法省掉了Flbm_data.close()
with open('spfwssflbm_yhzc.csv', 'w', newline='', encoding='utf_8_sig') as Yhzc_data:
csvwriter = csv.writer(Yhzc_data)
zzsyhzc_head = []
count = 0
for yhzc in root.findall('body/YHZC/ZZSYHZC'):
zzsyhzc = []
if count == 0:
yhzcmc ='优惠政策名称(' + yhzc.find('YHZCMC').tag + ')'
zzsyhzc_head.append(yhzcmc)
sl = '税率(' + yhzc.find('SL').tag + ')'
zzsyhzc_head.append(sl)
csvwriter.writerow(zzsyhzc_head)
count = count + 1
yhzcmc = yhzc.find('YHZCMC').text
zzsyhzc.append(yhzcmc)
sl = yhzc.find('SL').text
zzsyhzc.append(sl)
csvwriter.writerow(zzsyhzc)
#with用法省掉了Yhzc_data.close()
import pandas as pd
#相对路径
pd.read_csv('spfwssflbm_yhzc.csv').to_excel('spfwssflbm_yhzc.xlsx',index=False)
#绝对路径
filepath_in = r'C:\Users\XXX\spfwssflbm.csv'
filepath_out = r'C:\Users\XXX\spfwssflbm.xlsx'
df = pd.read_csv(filepath_in)
#避免商品编码变成科学计数法,版本号没有小数点
df['商品编码(SPBM)'] = df['商品编码(SPBM)'].apply(lambda x: '{:d}'.format(int(x)))
df['版本号(BB)'] = df['版本号(BB)'].apply(lambda x: '{:.1f}'.format(float(x)))
df.to_excel(filepath_out,index=False)
MWJY:密文校验
COUNT:数量
BMXX:编码信息
BB:版本
QYSJ:启用时间
GDQJZSJ:过渡期截止时间
SPBM:商品编码
SPMC:商品名称
SPBMJC:商品编码简称
SM:说明
ZZSSL:增值税税率
GJZ:关键字
HZX:汇总项 即是否可归并上一级
KYZT:可用状态
ZZSTSGL:增值税特殊管理
ZZSZCYJ:增值税政策依据
ZZSTSNRDM:增值税特殊内容代码
XFSGL:消费税管理
XFSZCYJ:消费税政策依据
XFSTSNRDM:消费税特殊内容代码
TJJBM:统计局编码
HGJCKSPPM:海关进出口商品品目
PID
GXSJ:更新时间
YHZC:优惠政策
ZZSYHZC:增值税优惠政策
YHZCMC:优惠政策名称
SL:税率
csvwriter = csv.writer(Yhzc_data)
zzsyhzc_head = []
count = 0
for yhzc in root.findall('body/YHZC/ZZSYHZC'):
zzsyhzc = []
if count == 0:
yhzcmc ='优惠政策名称(' + yhzc.find('YHZCMC').tag + ')'
zzsyhzc_head.append(yhzcmc)
sl = '税率(' + yhzc.find('SL').tag + ')'
zzsyhzc_head.append(sl)
csvwriter.writerow(zzsyhzc_head)
count = count + 1
yhzcmc = yhzc.find('YHZCMC').text
zzsyhzc.append(yhzcmc)
sl = yhzc.find('SL').text
zzsyhzc.append(sl)
csvwriter.writerow(zzsyhzc)
#with用法省掉了Yhzc_data.close()
import pandas as pd
#相对路径
pd.read_csv('spfwssflbm_yhzc.csv').to_excel('spfwssflbm_yhzc.xlsx',index=False)
#绝对路径
filepath_in = r'C:\Users\XXX\spfwssflbm.csv'
filepath_out = r'C:\Users\XXX\spfwssflbm.xlsx'
df = pd.read_csv(filepath_in)
#避免商品编码变成科学计数法,版本号没有小数点
df['商品编码(SPBM)'] = df['商品编码(SPBM)'].apply(lambda x: '{:d}'.format(int(x)))
df['版本号(BB)'] = df['版本号(BB)'].apply(lambda x: '{:.1f}'.format(float(x)))
df.to_excel(filepath_out,index=False)
字段说明
BBH:版本号MWJY:密文校验
COUNT:数量
BMXX:编码信息
BB:版本
QYSJ:启用时间
GDQJZSJ:过渡期截止时间
SPBM:商品编码
SPMC:商品名称
SPBMJC:商品编码简称
SM:说明
ZZSSL:增值税税率
GJZ:关键字
HZX:汇总项 即是否可归并上一级
KYZT:可用状态
ZZSTSGL:增值税特殊管理
ZZSZCYJ:增值税政策依据
ZZSTSNRDM:增值税特殊内容代码
XFSGL:消费税管理
XFSZCYJ:消费税政策依据
XFSTSNRDM:消费税特殊内容代码
TJJBM:统计局编码
HGJCKSPPM:海关进出口商品品目
PID
GXSJ:更新时间
YHZC:优惠政策
ZZSYHZC:增值税优惠政策
YHZCMC:优惠政策名称
SL:税率
评论
发表评论