如何从文本文件中根据日期查找对应发票编号
问题描述
我用Excel生成了数百组发票编号与对应周末结束日期的配对数据,转成TXT文件后每行格式如下:
1001,09/26/20, 1002,10/03/20, 1003,10/10/20, 1004,10/17/20, 1005,10/24/20,
现在需要实现:输入指定日期,找到对应的发票编号;如果把发票编号调整到日期右侧更方便实现,也可以调整格式。
我已经写了部分格式化日期并搜索文件的代码,但不知道后续怎么处理:
# declare the correct formatted date to search the file for date_search_formatted = date_input.strftime("%m/%d/%Y") # open the text file file = open(r"Invoice_doc_01.txt", "r") # read the text file file.read() # search for the string file.find(date_search_formatted) # save the text file file.close()
问题分析
原代码有几个关键问题:
file.read()读取了文件内容,但没有把内容保存到变量里,后续无法对内容进行操作- 文件对象没有
find()方法,这个方法属于字符串类型 - 直接读取整个文件再搜索,不如逐行处理高效,还能直接提取对应发票号
解决方案
方案1:保留原格式(发票号在左)
直接逐行读取文件,拆分每行内容,匹配日期后提取发票号:
from datetime import datetime # 示例:这里是用户输入的目标日期,可根据实际情况替换 date_input = datetime(2020, 9, 26) # 注意原文件日期是两位年份,用%y而非%Y date_search_formatted = date_input.strftime("%m/%d/%y") invoice_number = None # 用with语句自动管理文件关闭,比手动close更安全可靠 with open(r"Invoice_doc_01.txt", "r") as file: for line in file: line = line.strip() # 去掉换行符和首尾空格 if not line: continue # 跳过空行 # 按逗号拆分每行内容 parts = line.split(",") # 原格式是「发票号,日期,」,所以parts[0]是发票号,parts[1]是日期 if parts[1] == date_search_formatted: invoice_number = parts[0] break # 找到目标后直接跳出循环,提升效率 if invoice_number: print(f"找到对应发票编号:{invoice_number}") else: print("未找到该日期对应的发票编号")
方案2:调整格式(发票号在右)
如果把文件格式改成日期,发票号,,代码逻辑类似,只是拆分后取对应位置的值:
修改后的文件示例:
09/26/20,1001, 10/03/20,1002,
对应代码:
from datetime import datetime date_input = datetime(2020, 9, 26) date_search_formatted = date_input.strftime("%m/%d/%y") invoice_number = None with open(r"Invoice_doc_01.txt", "r") as file: for line in file: line = line.strip() if not line: continue parts = line.split(",") # 调整格式后「日期,发票号,」,parts[0]是日期,parts[1]是发票号 if parts[0] == date_search_formatted: invoice_number = parts[1] break if invoice_number: print(f"找到对应发票编号:{invoice_number}") else: print("未找到该日期对应的发票编号")
额外优化建议
如果需要频繁执行搜索操作,建议先把文件内容加载到字典中,后续搜索直接查字典,效率会更高:
from datetime import datetime # 先构建日期到发票号的映射字典 date_to_invoice = {} with open(r"Invoice_doc_01.txt", "r") as file: for line in file: line = line.strip() if not line: continue parts = line.split(",") date_to_invoice[parts[1]] = parts[0] # 后续搜索直接查询字典 date_input = datetime(2020, 9, 26) date_search_formatted = date_input.strftime("%m/%d/%y") invoice_number = date_to_invoice.get(date_search_formatted) if invoice_number: print(f"找到对应发票编号:{invoice_number}") else: print("未找到该日期对应的发票编号")
内容的提问来源于stack exchange,提问作者Parker Scott
相关产品推荐
相关产品推荐

