吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1842|回复: 19
上一主题 下一主题
收起左侧

[Python 原创] 电子发票(铁路电子客票)python字典

[复制链接]
跳转到指定楼层
楼主
th4c3y 发表于 2024-11-6 11:30 回帖奖励

电子发票(铁路电子客票)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)

免费评分

参与人数 3吾爱币 +3 热心值 +2 收起 理由
setupdircls + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
haiyou + 1 + 1 我很赞同!
qingyin123 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
lzmomo 发表于 2024-11-11 14:44
[Python] 纯文本查看 复制代码
"C:\Program Files\Python39\python.exe" E:\2024年工作文件夹\pythonProject\电子发票(铁路电子客票)python字典.py 
Traceback (most recent call last):
  File "E:\2024年工作文件夹\pythonProject\电子发票(铁路电子客票)python字典.py", line 69, in <module>
    _data_dict = my_getter.parse_ofd(myofdfile)
  File "E:\2024年工作文件夹\pythonProject\电子发票(铁路电子客票)python字典.py", line 35, in parse_ofd
    dic_data = self.result_data(tree_data, path)
UnboundLocalError: local variable 'tree_data' referenced before assignment

进程已结束,退出代码1

请问这要怎么处理呢
推荐
探玄珠 发表于 2024-11-6 14:35
挺好的          看看                                            
沙发
Xiaosesi 发表于 2024-11-6 11:51
3#
gst 发表于 2024-11-6 11:58
感谢分享!
4#
zhczlzhang 发表于 2024-11-6 13:14
这个可以,后续可以用python再写个转换的工具。
5#
HuskyHappy 发表于 2024-11-6 13:59
Xiaosesi 发表于 2024-11-6 11:51
感谢分享,纸质发票不能开了嘛

纸质的报销凭证不是要在火车站那里自己取的吗,现在直接手机开发邮箱就行了
6#
浣熊 发表于 2024-11-6 14:16
Xiaosesi 发表于 2024-11-6 11:51
感谢分享,纸质发票不能开了嘛

纸质,电子二选一,都能用
8#
Marken888 发表于 2024-11-6 14:44
Xiaosesi 发表于 2024-11-6 11:51
感谢分享,纸质发票不能开了嘛

目前还可以
9#
TS1933151 发表于 2024-11-6 14:59
这么厉害,下载试试
10#
mylove90 发表于 2024-11-6 15:19
收藏,备用
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-9 13:48

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表