I previously mentioned piecash will easily import csv transactions. It also
creates the account structure in the process.

piecash is a GnuCash compatible python library. It doesn't use GnuCash but
creates files that are compatible with GnuCash. piecash is an alternative
to the python bindings which are optionally part of GnuCash and use
GnuCash. See https://piecash.readthedocs.io/ for details.

----------------------------------------

The example below uses data based on GnuCash Tutorial and Concepts
Guide Part II. Managing Personal Finances -
https://gnucash.org/viewdoc.phtml?rev=4&lang=C&doc=guide

The sample code needs a code folder that must contain
`simple_csv_book_creation.py` and `demo.csv`, and a folder named
`gnucash_books` at the same level as the code folder.
`simple_csv_book_creation.py` must be run from the code folder.

D:\demo
|------ examples
|        demo.csv
|        simple_csv_book_creation.py
|
|------ gnucash_books

Install python Version 3

D:\>pip install piecash

D:\demo\examples>python simple_csv_book_creation.py
Created:  ../gnucash_books/simple_csv.gnucash

The file created can be opened in GnuCash.
from piecash import open_book, create_book, GnucashException, Account


def open_gnucash_book(GNUCASH_BOOK, **kwargs):
    # open or create gnucash book if not found
    import os
    import tempfile

    if os.path.exists(GNUCASH_BOOK) and not kwargs.get("overwrite"):
        print("Found: ", GNUCASH_BOOK)
        # open book file
        book = open_book(
            GNUCASH_BOOK,
            readonly=False,
            open_if_lock=True,
            do_backup=False,
            **kwargs,
        )
    else:
        # create book file
        book = create_book(
            GNUCASH_BOOK,
            currency=locale.localeconv()["int_curr_symbol"],
            **kwargs,
        )
        print("Created: ", GNUCASH_BOOK)
    return book


def get_or_create_account(book, fullname, type, **kwargs):
    # get_or_create_accounts
    acc_tree = ""
    for name in fullname.split(":"):
        if acc_tree:
            acc_tree += ":" + name
        else:
            acc_tree = name
            acc = book.root_account
        try:
            acc = book.accounts(fullname=acc_tree)
            # print("> Found: ", acc_tree)
        except KeyError:
            # print("> Create: ",  name)
            acc = Account(
                name=name,
                type=type,
                parent=acc,
                commodity=CURR,
                placeholder=False,
                **kwargs,
            )
            book.flush()
    return acc


def basic_coa():
    # get_or_create_accounts
    # must create top level account<>type or type="BANK"
    get_or_create_account(book, fullname="Asset", type="ASSET")
    get_or_create_account(book, fullname="Asset:Cheque", type="BANK")
    get_or_create_account(book, fullname="Asset:Saving", type="BANK")
    get_or_create_account(book, fullname="Expense", type="EXPENSE")
    get_or_create_account(book, fullname="Income", type="INCOME")


def print_coa():
    # basic account listing
    print()
    for account in book.accounts:
        print(account)


import locale

locale.setlocale(locale.LC_ALL, "")

GNUCASH_BOOK = "../gnucash_books/simple_csv.gnucash"
book = open_gnucash_book(GNUCASH_BOOK, overwrite=True)

# retrieve the default currency
CURR = book.default_currency

basic_coa()
# print_coa()

import csv
from piecash import open_book, Transaction, Split
from datetime import datetime, date
from decimal import Decimal

CSV_IMPORT = "demo.csv"
today = datetime.now()
import_account = get_or_create_account(book, fullname="Asset:Cheque", type="BANK")

# import file
with open(CSV_IMPORT, "r") as file:
    # initialise the CSV reader
    csv_file = csv.DictReader(file)

    # iterate on all the transactions in the file
    for row in csv_file:

        # reformat data as required
        transfer_account = get_or_create_account(
            book, fullname=row["Account"], type=row["Account"].split(":")[0].upper()
        )
        amount = Decimal(row["Amount"])

        # create the transaction with its two splits
        Transaction(
            post_date=date(
                int(row["Date"][6:8]) + 2000,
                int(row["Date"][3:5]),
                int(row["Date"][0:2]),
            ),
            enter_date=today,
            currency=CURR,
            num=row["Number"],
            description=row["Entity"],
            notes=row["Description"],
            splits=[
                Split(account=import_account, value=amount),
                Split(account=transfer_account, value=-amount),
            ],
        )
    # save the book
    book.save()

Attachment: demo.csv
Description: Binary data

_______________________________________________
gnucash-user mailing list
gnucash-user@gnucash.org
To update your subscription preferences or to unsubscribe:
https://lists.gnucash.org/mailman/listinfo/gnucash-user
If you are using Nabble or Gmane, please see 
https://wiki.gnucash.org/wiki/Mailing_Lists for more information.
-----
Please remember to CC this list on all your replies.
You can do this by using Reply-To-List or Reply-All.

Reply via email to