如果你已经决定使用纯文本记账(plain-text accounting)来管理财务,那么你已经做出了一个明智的选择。你的财务数据将存储在完全由你控制、可由人类阅读的文件中,通过版本控制进行追踪,并免受供应商锁定。但接下来的问题是:你应该使用哪款工具?
Beancount 和 hledger 是当今最受欢迎的两款纯文本记账(PTA)工具。它们都是开源的,由社区积极维护,且能够处理从个人预算到复杂投资组合的所有事务。然而,它们在记录、验证和分析财务数据的方法论上有着本质的区别。
本指南将分析它们之间的关键差异,以便你选择最适合你的工作流、经验水平和财务追踪需求的工具。
核心哲学:严格 vs. 灵活
Beancount 和 hledger 之间最大的区别不在于功能,而在于思维方式。
Beancount 是严厉的老师。 它假设你会犯数据录入错误,并内置了护栏以尽早捕获这些错误。每个账户在使用前必须显式开启。每笔交易必须平衡为零。货币必须遵循严格的格式。如果发现任何异常,Beancount 将拒绝处理你的文件,直到你修复错误。
hledger 是宽容的朋友。 它使用更宽松的语法,允许你跳过预先声明账户的步骤,甚至可以推断平衡分录。你可以用最少的设置开始追踪财务,并随着需求的增长逐渐增加结构。
这两种方法没有绝对的优劣之分。如果你希望在错误演变成数小时的调试工作之前就捕获它们,那么 Beancount 的严格性就是一个优点。如果你想快速上手并更喜欢灵活性,那么 hledger 的包容性则是其优势。
语法和数据格式
这两款工具都将交易存储在纯文本文件中,但语法规则有明显不同。
Beancount 语法
2026-03-15 * "Whole Foods" "Weekly groceries"
Expenses:Food:Groceries 85.42 USD
Liabilities:CreditCard:Visa关键规则:
- 日期使用 ISO 8601 格式 (
YYYY-MM-DD) - 货币必须是大写字母(例如
USD、EUR),不使用符号如$或€ - 账户名称至少需要两个由冒号分隔的组件(例如
Expenses:Food) - 描述必须是带引号的字符串
- 所有账户必须使用
open指令显式开启
hledger 语法
2026-03-15 Whole Foods | Weekly groceries
expenses:food:groceries $85.42
liabilities:creditcard:visa关键规则:
- 更灵活的日期格式
- 允许使用
$和€等货币符号 - 账户名称可以小写,且格式更自由
- 描述不需要引号
- 无需预先声明账户
结论:Beancount 较严格的语法意味着前期工作较多,但歧义较少。hledger 宽松的语法更容易上手,但需要更多的自律来保持一致性。
数据完整性和验证
这是 Beancount 真正脱颖而出的地方。
余额断言 (Balance Assertions)
两款工具都支持余额断言——即验证你记录的余额是否与银行账单相符。但它们的工作方式不同。
Beancount 使用带日期的余额断言,且与顺序无关。你可以随意重新排列交易文件,断言仍然有效。hledger 的断言则依赖于文件中的顺序,这意味着移动交易位置可能会导致断言失效。
库存追踪 (Inventory Tracking)
对于任何追踪投资的人来说,这一点至关重要。Beancount 强制执行严格的库存记账:你不能卖出从未买入的股票,并且它能精确追踪成本基准。这可以防止“成本基准流失”——这是一种细微的错误,会导致你的资本利得计算偏离现实。
hledger 也可以处理商品和批次,但强制性较低。它更灵活,但也意味着对于一些可能直到报税时才会被发现的错误更加宽容。
账户类别
Beancount 要求每个账户必须属于以下五个类别之一:资产 (Assets)、负债 (Liabilities)、收入 (Income)、支出 (Expenses) 或权益 (Equity)。这种约束使其能够自动生成规范的资产负债表和损益表。
hledger 允许任意的账户层级,没有强制性的根类别。这赋予了你更多自由,但也意味着你需要手动遵循惯例才能获得有意义的财务报表。
用户界面和报告
Beancount + Fava
Beancount 的亮点功能是 Fava,这是一个精美的 Web 界面,提供:
- 交互式图表(净资产趋势、支出细目、收入 vs. 支出)
- 支出类别的矩形树图可视化
- 按账户、标签、时间段和收款人进行的强大过滤
- 用于自定义报表的查询语言
- 账本文件的内置编辑器
Fava 被广泛认为是纯文本记账生态系统中最好的 UI。如果你是一个视觉导向的人,喜欢仪表板和图表,这是选择 Beancount 的一个重要理由。
hledger 界面
hledger 采用多界面方案:
- CLI:丰富的命令行报表,拥有数十个内置命令(
balance、register、incomestatement、cashflow等) - hledger-ui:用于以交互方式浏览账户和交易的终端 UI
- hledger-web:用于基本浏览和数据录入的简易 Web 界面
hledger 的命令行界面在开箱即用方面比 Beancount 更强大。如果你习惯于在终端操作,并希望获得快速且可脚本化的报表,hledger 能满足你的需求。
性能
hledger 使用 Haskell 编写,每秒可处理约 25,000 条交易。对于大多数个人理财用户来说,这两款工具的速度在实际使用中几乎都是瞬时的。但如果你正在管理一个庞大的数据集——例如横跨多个实体的多年交易记录——hledger 的原始速度优势便会显现出来。
Beancount (v3) 的核心解析器已使用 C++ 重写,相比原始的 Python 实现显著提升了性能。对于典型的个人或小企业用途,你不会察觉到其中的差异。
可扩展性与插件
Beancount 插件
Beancount 拥有极其强大的原生 Python 插件系统。插件可以:
- 自动拆分交易(例如:共享费用)
- 生成周期性交易
- 强制执行自定义验证规则
- 在处理流水线中转换数据
Python 生态系统意味着你可以在插件中利用任何 Python 库。这使得 Beancount 在应对复杂的财务场景时具有高度的可定制性。
hledger 扩展
hledger 通过以下方式提供可扩展性:
- 用于银行流水自动化的 CSV 导入规则
- 使用命令行输出的自定义报表脚本
- 用于构建集成的 HTTP-JSON API
- 基于 Haskell 的附加命令
hledger 的 CSV 导入系统备受推崇——通过规则文件将 CSV 列映射到账户分录,它使银行流水导入的自动化变得非常简单。
入门与学习曲线
hledger:较低的入门门槛
hledger 通常更容易上手:
- 安装单个二进制文件(出色的跨平台支持,包括 Windows)
- 创建一个文件并立即开始记录交易
- 无需声明账户或遵循严格的命名规范
- 详尽且维护良好的文档
- 拥有对初学者友好的资源和活跃社区
Beancount:更多的设置,更强的结构
Beancount 需要更多的初始设置:
- 安装 Python 和 Beancount(以及用于 Web 界面的 Fava)
- 在使用账户之前需要进行声明
- 从第一天起就必须遵循严格的语法规则
- 学习五个账户类别
权衡的结果是,这种前期投入会带来长期的回报。一个结构良好的 Beancount 账本在规模增长时更容易维护、验证和审计。
社区与生态系统
这两个项目都有活跃且提供支持的社区:
- Beancount:活跃的邮件列表,不断增长的第三方工具生态系统(导入器、插件、Fava 扩展),以及强大的 Python 开发者社区
- hledger:发布频繁(大约每季度一次),详尽的文档,活跃的聊天频道,以及更广泛的 plaintextaccounting.org 社区
这两款工具都受益于更广泛的纯文本会计运动,这意味着它们可以共享资源、导入器和社区知识。
工具间的迁移
如果你从其中一个工具开始,之后想要切换,迁移是可能的,但并非易事:
- 从 hledger 迁移到 Beancount:使用
hledger print -o tmp.beancount作为起点,然后调整语法(添加账户声明、修正货币格式、重组账户名称) - 从 Beancount 迁移到 hledger:可以使用
bean-report工具进行导出,但通常需要手动修正
共同的纯文本理念意味着你的数据永远不会被锁定。你始终可以读取和转换你的文件,即使这个过程需要一些手动清理。
快速对比表
| 特性 | Beancount | hledger |
|---|---|---|
| 开发语言 | Python/C++ | Haskell |
| 语法严格程度 | 严格 | 灵活 |
| 账户声明 | 必需 | 可选 |
| 最佳 UI | Fava (Web) | CLI + TUI |
| 投资跟踪 | 出色 | 良好 |
| 插件系统 | Python 插件 | 脚本 + API |
| CSV 导入 | 通过导入器 | 内置规则 |
| 学习曲线 | 较陡峭 | 较平缓 |
| 余额断言 | 与顺序无关 | 取决于文件顺序 |
| 性能 | 快 (v3) | 非常快 |
| Windows 支持 | 良好 | 出色 |
你应该选择哪一个?
在以下情况下选择 Beancount 假如你:
- 想要一个精美的 Web 仪表板来可视化你的财务状况
- 跟踪投资并需要精确的成本基准处理
- 偏好一个能及早发现错误并强制执行一致性的系统
- 熟悉 Python 并希望拥有强大的插件扩展性
- 看重与文件顺序无关的组织方式
在以下情况下选择 hledger 假如你:
- 偏好在终端工作,使用快速且可脚本化的报表
- 想要通过最少的配置快速上手
- 需要出色的 Windows 支持
- 偏好能适应你个人风格的灵活语法
- 想要频繁的版本发布和活跃的维护
诚实地说:这两款工具都非常优秀。无论你使用哪款工具,纯文本会计社区都非常欢迎你,而且你在其中一款工具中学到的技能可以轻松迁移到另一款。选择最符合你工作流程的那一个,试用一个月,如有需要再进行调整。
使用 Beancount.io 简化你的财务追踪
无论你选择 Beancount 还是 hledger,纯文本记账都能让你完全掌控自己的财务数据。如果你希望在拥有 Beancount 强大功能的同时,还能享有托管的 Fava 面板、自动银行导入以及零基础设施管理,Beancount.io 将让这一切变得轻松自如。免费开始使用,无需繁琐的配置即可体验纯文本记账。