电子发票(铁路电子客票)python字典

查看 63|回复 9
作者:th4c3y   
电子发票(铁路电子客票)ofd文件数据用python处理成字典,以便后续使用。
import zipfile
import xmltodict
import os, shutil, time
from tkinter import filedialog
class Mygetofd():
    # 定义主函数 mygetofd,包含两个嵌套函数。
    def unzip_file(self, zip_path, unzip_path=None):
        # 如果没有提供 unzip_path,则通过去除文件扩展名从 zip_path 中推导出 unzip_path。
        if not unzip_path:
            unzip_path = zip_path.split('.')[0]  # 从 zip_path 中获取不带扩展名的基本名称。
        # 以读取模式打开 zip 文件。
        with zipfile.ZipFile(zip_path, 'r') as f:
            # 将 zip 存档中的所有文件提取到指定目录。
            for file in f.namelist():
                f.extract(file, path=unzip_path)  # 将每个文件提取到 unzip_path。
        return unzip_path  # 返回解压后文件存放的路径。
    def parse_ofd(self, path):
        file_path = self.unzip_file(path)  # 调用 unzip_file 函数提取 OFD 文件并获取路径。           
        # 以 UTF-8 编码打开 XML 内容文件进行读取。
        pages_directory = os.path.join(file_path, "Doc_0", "Attachs")
        for root, dirs, files in os.walk(pages_directory):   #目录的路径,目录列表,文件列表
            for file in files:
                if "rai_issuer" in file:
                    xml_path = os.path.join(root, file)
                    with open(xml_path, "r", encoding="utf-8") as f:
                        _text = f.read()  # 读取 XML 文件的全部内容
                        tree = xmltodict.parse(_text)  # 将 XML 内容解析为 Python 字典
                        tree_data = tree['xbrl']
        dic_data = self.result_data(tree_data, path)   
        print(dic_data)            
        #删除解压文件
        self.delete_file(file_path)
    def delete_file(self, folder_path):
        shutil.rmtree(folder_path.replace('/', '\\'))
    def result_data(self, data, path):
        result_dic = {}
        result_dic["文件路径"] = path
        result_dic["发票号码"] = data.get("rai:ElectronicInvoiceRailwayETicketNumber", "").get("#text", "")
        result_dic["发票类型"] = data.get("rai:TypeOfVoucher", "").get("#text", "")
        result_dic["开票日期"] = data.get("rai:DateOfIssue", "").get("#text", "")
        result_dic["购买方名称"] = data.get("rai:NameOfPurchaser", "").get("#text", "")
        result_dic["统一社会信用代码"] = data.get("rai:UnifiedSocialCreditCodeOfPurchaser", "").get("#text", "")
        result_dic["不含税金额"] = data.get("rai:TotalAmountExcludingTax", "").get("#text", "")
        result_dic["税额"] = data.get("rai:TaxAmount", "").get("#text", "")
        result_dic["电子客票号"] = data.get("rai:ETicketNumber", "").get("#text", "")
        result_dic["出发站"] = data.get("rai:DepartureStation", "").get("#text", "")
        result_dic["目的站"] = data.get("rai:DestinationStation", "").get("#text", "")
        result_dic["车次号"] = data.get("rai:TrainNumber", "").get("#text", "")
        result_dic["出发日期"] = data.get("rai:TravelDate", "").get("#text", "")
        result_dic["发车时间"] = data.get("rai:DepartureTime", "").get("#text", "")
        result_dic["座次"] = data.get("rai:SeatLevel", "").get("#text", "")
        result_dic["座位号"] = data.get("rai:Seat", "").get("#text", "")
        result_dic["乘车人"] = data.get("rai:Name", "").get("#text", "")
        result_dic["证件号"] = data.get("rai:IdNumber", "").get("#text", "")
        result_dic["票价"] = data.get("rai:Fare", "").get("#text", "")
        return result_dic
if __name__ == '__main__':
    myofdfile = filedialog.askopenfilename(defaultextension='.ofd')
    my_getter = Mygetofd()
    _data_dict = my_getter.parse_ofd(myofdfile)

文件, 发票

探玄珠   

挺好的          看看                                            
Xiaosesi   

感谢分享,纸质发票不能开了嘛
gst   

感谢分享!
zhczlzhang   

这个可以,后续可以用python再写个转换的工具。
HuskyHappy   


Xiaosesi 发表于 2024-11-6 11:51
感谢分享,纸质发票不能开了嘛

纸质的报销凭证不是要在火车站那里自己取的吗,现在直接手机开发邮箱就行了
浣熊   


Xiaosesi 发表于 2024-11-6 11:51
感谢分享,纸质发票不能开了嘛

纸质,电子二选一,都能用
Marken888   


Xiaosesi 发表于 2024-11-6 11:51
感谢分享,纸质发票不能开了嘛

目前还可以
TS1933151   

这么厉害,下载试试
mylove90   

收藏,备用
您需要登录后才可以回帖 登录 | 立即注册

返回顶部