正则表达式转换逻辑能否存储在字典中?QIF转CSV开发疑问
QIF转CSV的正则处理指令存储与Quiffen库错误解决
一、字典中直接存储转换指令的可行方式
你可以用eval()或exec()执行存储为字符串的转换逻辑,但务必确保这些字符串是完全可信的(避免代码注入风险),示例如下:
# 存储转换指令字符串的字典 transform_dict = { "transaction": "f'{match.group(\"date\")},{match.group(\"amount\")},{match.group(\"payee\")}'" } # 使用时(假设已通过正则匹配得到match对象) import re match = re.search(r"^D(?P<date>.*)\n^T(?P<amount>.*)\n^P(?P<payee>.*)", qif_line, re.MULTILINE) if match: csv_line = eval(transform_dict["transaction"])
如果担心eval()的安全风险,也可以用字符串模板+关键字参数的方式,灵活性稍弱但更安全:
transform_dict = { "transaction": "{date},{amount},{payee}" } # 使用时 csv_line = transform_dict["transaction"].format(**match.groupdict())
不过从可维护性和安全性来说,用字典存储函数(或lambda表达式)仍是最优方案,比如:
transform_dict = { "transaction": lambda m: f"{m.group('date')},{m.group('amount')},{m.group('payee')}" } csv_line = transform_dict["transaction"](match)
二、Quiffen库“Unknown line code: t”错误解决
这个错误是因为Quiffen仅支持QIF标准定义的行码(如D日期、T金额、P收款人等),而你的QIF文件中存在自定义的小写t开头行,库无法识别。解决方法有两种:
- 预处理QIF文本,过滤自定义行
with open("input.qif", "r") as f: qif_content = f.read() # 移除所有以小写t开头的行 cleaned_qif = re.sub(r'^t.*\n', '', qif_content, flags=re.MULTILINE) # 用Quiffen解析清理后的内容 from quiffen import Qif qif = Qif.parse(cleaned_qif)
- 给Quiffen注册自定义行码处理器
Quiffen支持扩展自定义行码,你可以注册一个处理t行的函数:
from quiffen import Qif, Transaction def handle_t_line(transaction, line): # 自定义处理逻辑,比如把t行内容追加到交易备注中 transaction.memo = f"{transaction.memo or ''} | {line[1:].strip()}" return transaction # 注册针对Transaction类型的t行处理器 Qif.register_line_code_handler('t', handle_t_line, entry_type=Transaction) # 直接解析原QIF文件 qif = Qif.parse("input.qif")
内容的提问来源于stack exchange,提问作者Maxcot
相关产品推荐
相关产品推荐

