跳至主要内容

实战 之 spfwssflbm.xml2xlsx(用csv过渡)


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
  1. import pandas as pd
  2. my_dic = pd.read_excel(r'C:\Users\DZL\Desktop\spfwssflbm.xlsx', index_col=0).to_dict()
  3. print(my_dic)


代码如下


  1. import xml.etree.ElementTree as ET
  2. import csv
  3. import pandas as pd
  4.  
  5. # 字段中英文对照
  6. dic = {'BB''版本',
  7.        'QYSJ''启用时间',
  8.        'GDQJZSJ''过渡期截止时间',
  9.        'SPBM''商品编码',
  10.        'SPMC''商品名称',
  11.        'SPBMJC''商品编码简称',
  12.        'SM''说明',
  13.        'ZZSSL''增值税税率',
  14.        'GJZ''关键字',
  15.        'HZX''是否汇总项',
  16.        'KYZT''可用状态',
  17.        'ZZSTSGL''增值税特殊管理',
  18.        'ZZSZCYJ''增值税政策依据',
  19.        'ZZSTSNRDM''增值税特殊内容代码',
  20.        'XFSGL''消费税管理',
  21.        'XFSZCYJ''消费税政策依据',
  22.        'XFSTSNRDM''消费税特殊内容代码',
  23.        'TJJBM''统计局编码',
  24.        'HGJCKSPPM''海关进出口商品品目',
  25.        'PID''PID',
  26.        'GXSJ''更新时间'}
  27.  
  28. # tree = ET.parse('spfwssflbm.xml')
  29. # root = tree.getroot()
  30. # 避免直接解析gbk编码的xml文件报错
  31. with open('spfwssflbm.xml', 'rb') as f:
  32.    root = ET.fromstring(f.read().decode('gbk', 'ignore'))
  33.  
  34. # newline=''防止生成空白行, encoding='utf_8_sig'自动转码
  35. with open('spfwssflbm.csv', 'w', newline='', encoding='utf_8_sig') as flbm_data:
  36.     csvwriter = csv.writer(flbm_data)
  37.     # 添加标题行
  38.     flbm_head = []
  39.     for i in dic.values():
  40.         flbm_head.append(i)    
  41.     csvwriter.writerow(flbm_head)
  42.  
  43.     for bmxx in root.findall('body/BMXX'):
  44.         # 添加内容
  45.         flbm_body = []
  46.         for j in dic.keys():
  47.             flbm_body.append(bmxx.find(j).text)
  48.         csvwriter.writerow(flbm_body)
  49.  
  50. df = pd.read_csv('spfwssflbm.csv', index_col=False)
  51. # 避免版本丢失小数点, 商品编码、PID变成科学计数法
  52. df['版本'] = df['版本'].apply(lambda x: '{:.1f}'.format(float(x)))
  53. df['商品编码'] = df['商品编码'].apply(lambda x: '{:d}'.format(int(x)))
  54. df['PID'] = df['PID'].apply(lambda x: '{:d}'.format(int(x)))
  55.  
  56. 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)





字段说明

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:税率

评论

此博客中的热门博文

自动发送消息

  # https://pyperclip.readthedocs.io/en/latest/ import pyperclip while True :     # pyperclip.copy('Hello, world!')     # pyperclip.paste()     # pyperclip.waitForPaste()     print ( pyperclip. waitForNewPaste ( ) )     # 获取要输入新的坐标,也可以通过autohotkey import time import pyautogui  as pag import os   try :     while True :         print ( "Press Ctrl-C to end" )         x , y = pag. position ( )   # 返回鼠标的坐标         posStr = "Position:" + str ( x ) . rjust ( 4 ) + ',' + str ( y ) . rjust ( 4 )         print ( posStr )   # 打印坐标         time . sleep ( 0.2 )         os . system ( 'cls' )   # 清楚屏幕 except KeyboardInterrupt :     print ( 'end....' )     # 打印消息 import pyautogui import time import pyperclip   content = """   呼叫龙叔! 第二遍! 第三遍! 第四遍...

学习地址

清华大学计算机系课程攻略 https://github.com/PKUanonym/REKCARC-TSC-UHT 浙江大学课程攻略共享计划 https://github.com/QSCTech/zju-icicles https://home.unicode.org/ 世界上的每个人都应该能够在手机和电脑上使用自己的语言。 http://codecanyon.net   初次看到这个网站,小伙伴们表示都惊呆了。原来代码也可以放在网上卖的?!! 很多coder上传了各种代码,每个代码都明码标价。看了下销售排行,有的19刀的卖了3万多份,额di神啊。可以看到代码的演示效果,真的很漂亮。代码以php、wordpress主题、Javascript、css为主,偏前台。 https://www.lintcode.com/ 算法学习网站,上去每天刷两道算法题,走遍天下都不怕。 https://www.codecademy.com/ 包含在线编程练习和课程视频 https://www.reddit.com/ 包含有趣的编程挑战题,即使不会写,也可以查看他人的解决方法。 https://ideone.com/ 在线编译器,可运行,可查看代码示例。 http://it-ebooks.info/ 大型电子图书馆,可即时免费下载书籍。 刷题 https://github.com/jackfrued/Python-100-Days https://github.com/kenwoodjw/python_interview_question 面试问题 https://github.com/kenwoodjw/python_interview_question https://www.journaldev.com/15490/python-interview-questions#python-interpreter HTTP 身份验证 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Authentication RESTful 架构详解 https://www.runoob.com/w3cnote/restful-architecture.html https://www.rosettacode.org/wiki/Rosetta_C...

mysql 入门

资料 https://dinfratechsource.com/2018/11/10/how-to-install-latest-mysql-5-7-21-on-rhel-centos-7/ https://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html https://www.runoob.com/mysql/mysql-create-database.html https://www.liquidweb.com/kb/install-java-8-on-centos-7/ 工具 https://www.heidisql.com/ HeidiSQL是免费软件,其目标是易于学习。 “ Heidi”使您可以从运行数据库系统MariaDB,MySQL,Microsoft SQL或PostgreSQL的计算机上查看和编辑数据和结构 MySQL 连接时尽量使用 127.0.0.1 而不是 localhost localhost 使用的 Linux socket,127.0.0.1 使用的是 tcp/ip 为什么我使用 localhost 一直没出问题 因为你的本机中只有一个 mysql 进程, 如果你有一个 node1 运行在 3306, 有一个 node2 运行在 3307 mysql -u root -h localhost -P 3306 mysql -u root -h localhost -P 3307 都会连接到同一个 mysql 进程, 因为 localhost 使用 Linux socket, 所以 -P 字段直接被忽略了, 等价于 mysql -u root -h localhost mysql -u root -h localhost 而 -h 默认是 localhost, 又等价于 mysql -u root mysql -u root 为了避免这种情况(比如你在本地开发只有一个 mysql 进程,线上或者 qa 环境有多个 mysql 进程)最好的方式就是使用 IP mysql -u root -h 127 .0 .0 .1 -P 3307 strac...