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)