DevelopmentPayment protectionDetails
- Revisions within the package are free.
- If you do not respond within 3 days of delivery, the work is accepted automatically.
The money is reserved when you pay and released only once you accept the work.

Example result
Merging the monthly sales files of 9 shops into one Excel report
How it is run
python merge_sales.py --month 2026-10
2026-11-02 09:14:03 INFO Folder: sales/2026-10, 9 files found
2026-11-02 09:14:03 INFO shop-01.csv: 1,284 rows
2026-11-02 09:14:04 INFO shop-02.xlsx: 967 rows
2026-11-02 09:14:04 WARN shop-07.csv: 3 rows without a price skipped (lines 88, 412, 913)
2026-11-02 09:14:05 INFO Done: 10,412 rows -> report-2026-10.xlsx (sheets "Sales" and "Totals")
Settings, not code
The column names of each shop live in settings.ini, so a new shop or a renamed column is a line there:
[columns]
date = Date, Sale date, Day
product = Product, Item, Name
quantity = Qty, Quantity, Pcs
price = Price, Unit price
A part of the code
def read_shop_file(path: Path, columns: dict[str, list[str]]) -> pd.DataFrame:
"""Reads one shop's file and gives it the report's column names."""
table = pd.read_excel(path) if path.suffix == ".xlsx" else pd.read_csv(path, encoding="utf-8-sig")
renamed = {}
for name, variants in columns.items():
found = next((c for c in table.columns if c.strip() in variants), None)
if found is None:
raise ReportError(f"{path.name}: no column for '{name}' (looked for {', '.join(variants)})")
renamed[found] = name
table = table.rename(columns=renamed)[list(columns)]
table["shop"] = path.stem
return table
Files: a ZIP archive with merge_sales.py (310 lines), settings.ini, requirements.txt and a README with installing Python, running the script and what each message in the log means. The client runs it on their own computer.
Client: a small chain of 9 stationery shops; each shop sends its sales for the month as a CSV or Excel file, with slightly different column names. Task: one script that reads every file in a folder, brings the columns to one shape, and writes a single Excel report with all sales and a sheet of totals by shop.
The client and all details are made up.
About this service
Banks export statements in their own CSV layout, and accounting programs want theirs: other column names, dates as DD.MM.YYYY or YYYY-MM-DD, one amount with a minus sign or separate debit and credit, a particular encoding. This Python script converts the statement you download from your online bank into your program's import file, by the template or sample file that program gives. From Standard it can also put each line into a category by your rules, such as payments mentioning Rent go to Rent. It runs on your computer and never connects to your bank or accounting program; you download the statement and import the result yourself. It changes only the layout, not the figures, and gives no accounting or tax advice. Check the totals after the first import.
What is included
- What you getA ZIP archive with the Python script, a README with step-by-step instructions and, from Standard, a settings file with columns and category rules; the code is also shown on the order page.
- Your program's formatBy its import template or a sample file
- Dates and amounts rightFormats, signs and decimal separators converted
- Categories by your rulesFrom Standard, keywords you set
- Stays on your computerNo connection to the bank or anywhere else
- Readable codeWith comments, easy to add a rule later
How it works
- 1SamplesYou send made-up lines in your bank's layout and your program's template
- 2CodeWe write the script and the guide to running it
- 3Try itYou convert one statement, import it into a test company or period and check totals
- 4ChangesYou ask for changes within your package and send any error message
What we need from you
The header row and 10-20 lines of your bank's CSV with made-up amounts, names and account numbers but the same layout, the name of your accounting program and its import template, documentation page or a sample file it accepts. For Standard, your category rules (which words go to which category). For Premium, a sample from each bank or account. Never send real statements, account numbers or bank logins.
We will ask you:
- Which bank export do you have?
- Which accounting program, and its import format?
- Do you need categories?
- How many banks or accounts?
Compare packages
| Packages | BasicOne bank, one format$16 | StandardConverter with settings$33 | PremiumConverter tool$67 |
|---|---|---|---|
| Deadline | 1 day | 2 days | 3 days |
| Revisions | 1 | 2 | 3 |
| Code | up to 150 lines | up to 400 lines | up to 1,000 lines |
| Files of code | 1 | up to 3 | up to 8 |
| Settings file | No | Yes | Yes |
| Clear error messages and a log | No | Yes | Yes |
| Run options and a guide to running it on a schedule | No | No | Yes |
| Guide to installing and running it (README) | Yes | Yes | Yes |
| Language | Python | Python | Python |
| Order Basic | Order Standard | Order Premium |
Payment protection
You pay when you order, but the money is released only for accepted work.
- Fixed priceThe package price does not change after you pay.
- The money is reservedWhen you pay, the amount is only reserved. It is released to the service once you accept the work.
- Checked before deliveryEvery result goes through a quality check before it reaches you, and you see it on the order page before accepting it.
- Free revisionsAsk for changes within your brief as many times as the package allows.
- Acceptance after 3 daysIf within 3 days of delivery you neither accept the work nor ask for changes, it is accepted automatically. If you write in the order chat after delivery, the order waits; once we answer, we may start the 3 days again and will say so in the chat.
- Redo or a full refundIf the result does not match your brief and the revisions did not fix it, or the work takes more than twice its deadline, write in the order chat: we will redo the work or refund the payment in full.
Questions and answers
Does it connect to my bank?
No. You download the statement from your online bank as usual, and the script converts the file on your computer. It has no internet access in its code.
My bank only gives PDF statements.
This offer works from CSV or Excel. If the PDF has real text, see our offer for tables from PDF to Excel; scanned statements are not covered.
Will the categories be correct for my taxes?
The script applies the keyword rules you give; it does not decide how anything should be booked or taxed. That is for you or your accountant, and we give no tax or accounting advice.
What if my bank changes its export?
From Standard the column names sit in the settings file, so a renamed column is a small change. A new layout may need the script adjusted.
Did not find your answer?


