Instantly share code, notes, and snippets.

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)

This comment has been minimized.

brunov25 commented Apr 30, 2016

proposal: in line 9 insert a new line with
account = account.title() # to force capitalization of the account names


This comment has been minimized.

jan-loeffler commented Mar 22, 2017

Does somebody know how to include tags ?


This comment has been minimized.

glasserc commented Aug 21, 2017

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.


This comment has been minimized.

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