Contact list cleanupDevelopment & Customization

A Python script that tidies your own contact list: one format for names, phones and emails, and no duplicates

Usually ready in 15 minutesRevisions includedQuality check
Packages
Payment 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.

A Python script that tidies your own contact list: one format for names, phones and emails, and no duplicates

Example result

Example for the Standard package

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

A contact list gathered over years from a shop, a CRM and spreadsheets ends up with the same person three times, phones written five ways and emails with spaces or typos. This Python script cleans your own list on your computer: trims spaces, fixes capital letters, writes phone numbers in one format, flags emails whose form is broken and finds duplicates by email or phone, then saves a clean file and a separate file of what it removed, so you can check it. Send us a few rows with made-up names, phones and emails that look like yours, and your rules. The list never comes to us, and the script never sends anything anywhere. It checks the form of an address, not whether the mailbox exists.

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 your cleanup rules; the code is also shown on the order page.
  • Duplicates foundBy email, by phone or by the two together
  • One phone formatWith the country code you set for numbers without one
  • Removed rows keptA separate file with every removed or merged row
  • Stays on your computerYour list is never uploaded or sent
  • Readable codeWith comments, easy to change a rule later

How it works

  1. 1
    RulesYou send made-up sample rows and your rules for duplicates
  2. 2
    CodeWe write the script and the guide to running it
  3. 3
    Try itYou run it on a copy of your list and look through the removed rows
  4. 4
    ChangesYou ask for changes within your package and send any error message

What we need from you

The column names of your list and 10-20 rows with made-up names, phones and emails written the way they appear in your real data (with the same kinds of mess). Your rules: what counts as a duplicate, which row to keep (the newest, the fullest), the country code for local phone numbers and how phones should be written. CSV or Excel, and your system: Windows, macOS or Linux. Never send the real list.

We will ask you:

  • Where does the list come from?
  • What counts as a duplicate?
  • Which row should stay?
  • How should phones look?

Compare packages

PackagesBasicBasic cleanup$16StandardCleanup with rules$33PremiumCleanup tool$67
Deadline1 day2 days3 days
Revisions123
Codeup to 150 linesup to 400 linesup to 1,000 lines
Files of code1up to 3up to 8
Settings fileNoYesYes
Clear error messages and a logNoYesYes
Run options and a guide to running it on a scheduleNoNoYes
Guide to installing and running it (README)YesYesYes
LanguagePythonPythonPython
Order BasicOrder StandardOrder 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.
How it works →

Questions and answers

Can it tell me which emails are dead?

No. It checks that an address is written correctly (one @, a domain, no spaces) and flags common typos in the domain. Whether a mailbox exists only the mail service knows, and checking that is not part of this offer.

Can it find John Smith and J. Smith as one person?

In Premium it flags such near-duplicates for you to decide, instead of merging them on its own, because names alone are not reliable. Exact duplicates by email or phone are merged by your rules.

Is my contact list safe?

It never leaves your computer: you run the script yourself, it has no internet access in its code, and we only see the made-up rows you send. Keep the list and its clean copy as safely as before.

Can it add contacts or find missing emails?

No. It only tidies the contacts you already have. It does not look anyone up or collect new data.

Did not find your answer?

Packages