Some time ago I wrote a library to read MT940 files with Python. While there are multiple libraries available for this target, none of the others really work properly and/or support all variants of the format.
The MT940 library I wrote is slightly different, it’s designed to be able to parse any MT940 file, regardless whether it’s correct or complete. The initial version of the library was very strict and only supported files that perfectly followed the standards, a few months after the release it became obvious that most banks either used different standards when implementing the standard or interpreted the standard different. Regardless, the library gave little to no results or even crashed on some MT940 files.
Upon reflection I rewrote nearly all of the code to have a script that is flexible enough to support any format (even supporting custom processors for specific format) and wrote test code that tested every MT940 file I could find on the web. The result… a library that parsers pretty much everything out there while still maintaining a reasonable amount of results.
Usage? As simple as you might imagine. After installing (
pip install mt-940, note the dash) usage can be as simple as this:
import mt940 import pprint transactions = mt940.parse('tests/jejik/abnamro.sta') print 'Transactions:' print transactions pprint.pprint(transactions.data) print for transaction in transactions: print 'Transaction: ', transaction pprint.pprint(transaction.data)
import pytest import mt940 @pytest.fixture def sta_data(): with open('tests/jejik/abnamro.sta') as fh: return fh.read() def test_pre_processor(sta_data): transactions = mt940.models.Transactions(processors=dict( pre_closing_balance=[ mt940.processors.add_currency_pre_processor('USD'), ], pre_opening_balance=[ mt940.processors.add_currency_pre_processor('EUR'), ], )) transactions.parse(sta_data) assert transactions.data['closing_balance'].amount.currency == 'USD' assert transactions.data['opening_balance'].amount.currency == 'EUR' def test_post_processor(sta_data): transactions = mt940.models.Transactions(processors=dict( post_closing_balance=[ mt940.processors.date_cleanup_post_processor, ], )) transactions.parse(sta_data) assert 'closing_balance_day' not in transactions.data