Skip to content

Instantly share code, notes, and snippets.

Created November 7, 2014 18:57
  • Star 5 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
Star You must be signed in to star a gist
What would you like to do?
Ledger to Beancount
import ledger
import sys
import re
def account_name(post):
account = post.account.fullname().replace(" ","").replace("(","").replace(")","").replace("'","")
return re.sub(r'\:(\d)',r':X\1', account)
def get_symbol(amount):
symbol = amount.commodity.symbol.replace("-","").replace("\"","").upper()
if symbol == "$":
symbol = "USD"
return symbol
filename = sys.argv[1]
accounts = set()
for xact in ledger.read_journal(filename).xacts():
for post in xact.posts():
account = account_name(post)
if account not in accounts:
print "%s open %s" % (, account)
print "%s * \"%s\"" % (, xact.payee)
for post in xact.posts():
account = account_name(post)
symbol = get_symbol(post.amount)
if post.amount.has_annotation():
price = post.amount.price()
if post.amount.number() != 0:
price = price / post.amount.number()
psym = get_symbol(price)
print " %-50s %s %s @ %s %s" % (account, post.amount.number(), symbol, price.number(), psym)
print " %-50s %s %s" % (account, post.amount.number(), symbol)
Copy link

This solution drops some features of my ledger file that I find quite important -- namely, comments and balance assertions. To address this, I wrote another ledger-to-beancount converter which works syntactically.

Copy link

zacchiro commented Apr 6, 2018

You might want to check ledger2beancount, which is feature-complete w.r.t. ledger functionalities that can be faithfully supported in beancount.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment