You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则表达式转换逻辑能否存储在字典中?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开头行,库无法识别。解决方法有两种:

  1. 预处理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)
  1. 给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:37:15