25 from gnucash
import GncNumeric, Session, SessionOpenMode
28 def get_all_sub_accounts(account, names=[]):
29 "Iterate over all sub accounts of a given account." 31 for child
in account.get_children_sorted():
32 child_names = names.copy()
33 child_names.append(child.GetName())
34 yield child,
'::'.join(child_names)
35 yield from get_all_sub_accounts(child, child_names)
38 def to_string_with_decimal_point_placed(number: GncNumeric):
39 """Convert a GncNumeric to a string with decimal point placed if permissible. 40 Otherwise returns its fractional representation. 43 number = copy.copy(number)
44 if not number.to_decimal(
None):
47 nominator = str(number.num())
48 point_place = str(number.denom()).count(
'0')
52 if len(nominator) <= point_place:
53 nominator =
'0' * (point_place - len(nominator)) + nominator
55 return '.'.join([nominator[:-point_place], nominator[-point_place:]])
58 if __name__ ==
'__main__':
59 print(
'Name,Commodity,Totals,Totals (USD)')
60 with Session(sys.argv[1], SessionOpenMode.SESSION_READ_ONLY)
as session:
61 commodity_table = session.book.get_table()
62 USD = commodity_table.lookup(
"ISO4217",
"USD")
63 root_account = session.book.get_root_account()
64 for account, account_name
in get_all_sub_accounts(root_account):
65 print(
','.join([account_name,
66 account.GetCommodity().get_mnemonic(),
67 to_string_with_decimal_point_placed(account.GetBalance()),
68 to_string_with_decimal_point_placed(account.GetBalanceInCurrency(USD,
True))