Quiffen is a Python package for parsing QIF (Quicken Interchange Format) files.
The package allows users to both read QIF files and interact with the contents, and also to create a QIF structure and then output to either a QIF file, a CSV of transaction data or a pandas DataFrame.
QIF is an old file type, but has its merits because:
- It's standardised (apart from dates, but that can be dealt with)
- Unlike CSVs, QIF files all follow the same format, so they don't require special attention when they come from different sources
- It's written in plain text
- Import QIF files and manipulate data
- Create QIF structures (support for Transactions, Investments, Accounts, Categories, Classes, Splits)
- Convert Qif objects to a number of different formats and export (pandas DataFrame, CSV, QIF file)
Here's an example parsing of a QIF file:
>>> from quiffen import Qif >>> qif = Qif.parse('test.qif') >>> qif.accounts {'Quiffen Default Account': Account(name='Quiffen Default Account', desc='The default account created by Quiffen when no other accounts were present')} >>> acc = qif.accounts['Quiffen Default Account'] >>> acc.transactions {'Bank': TransactionList(Transaction(date=datetime.datetime(2021, 2, 14, 0 , 0), amount=150.0, ...), ...), 'Invst': TransactionList(...)} >>> tr = acc.transactions['Bank'][0] >>> print(tr) Transaction: Date: 2020-02-14 00:00:00 Amount: 67.5 Payee: T-Mobile Category: Cell Phone Split Categories: ['Bills'] Splits: 2 total split(s) >>> qif.categories {'Bills': Category(name='Bills), expense=True, hierarchy='Bills'} >>> bills = qif.categories['Bills'] >>> print(bills.render_tree()) Bills (root) โโ Cell Phone >>> df = qif.to_dataframe(data='transactions') >>> df.head() date amount payee ... memo cleared check_number 0 2020-02-14 67.5 T-Mobile ... NaN NaN NaN 1 2020-02-14 32.0 US Post Office ... money back for damaged parcel NaN NaN 2 2020-12-02 -10.0 Target ... two transactions, equal NaN NaN 3 2020-11-02 -25.0 Walmart ... non split transaction X 123.0 4 2020-10-02 -100.0 Amazon.com ... test order 1 * NaN ...
And here's an example of creating a QIF structure and exporting to a QIF file:
>>> import quiffen >>> from datetime import datetime >>> qif = quiffen.Qif() >>> acc = quiffen.Account('Personal Bank Account', desc='My personal bank account with Barclays.') >>> qif.add_account(acc) >>> groceries = quiffen.Category('Groceries') >>> essentials = quiffen.Category('Essentials') >>> groceries.add_child(essentials) >>> qif.add_category(groceries) >>> tr = quiffen.Transaction(date=datetime.now(), amount=150.0) >>> acc.add_transaction(tr, header='Bank') >>> qif.to_qif() # If a path is provided, this will save the file too! '!Type:CatnNGroceriesnETruenIFalsen^nNGroceries:EssentialsnETruenIFalsen^n!AccountnNPersonal Bank AccountnDMy personal bank account with Barclays.n^n!Type:BanknD02/07/2021nT150.0n^n'
Documentation can be found at: https://quiffen.readthedocs.io/en/latest/
Install Quiffen by running:
>>> pip install quiffen
- pandas (optional) for exporting to DataFrames
- The
to_dataframe()
method will not work without pandas installed.
- The
- Add support for the
MemorizedTransaction
object present in QIF files.
GitHub pull requests welcome, though if you want to make a major change, please open an issue first for discussion.
- Issue Tracker: https://github.com/isaacharrisholt/quiffen/issues
- Source Code: https://github.com/isaacharrisholt/quiffen
If you are having issues, please let me know.
The project is licensed under the GNU GPLv3 license.