Putting a UI on My Access-to-CSV Converter

by 

| February 11, 2026 | in

Once I got the command-line version working exactly how I wanted, I noticed I was doing the same thing over and over: pick an Access file, choose an output folder, hit run, then open Finder to dig through the CSVs. It worked great, but it felt a little clunky—especially if I wanted to share it with someone who isn’t glued to the terminal like I am.

So I decided to throw a simple UI on top of it.

My First Attempt (and Why I Bailed)

My initial thought was to whip up a tiny desktop app with Tkinter. It’s built into Python, super lightweight, perfect for this kind of thing… except on my Mac, my current Python install didn’t have Tk support enabled. I got the classic _tkinter import error. Sure, I could have reinstalled Python with Tcl/Tk or messed around with Homebrew, but the last thing I wanted was to tell anyone “first, rebuild your Python installation.” Nope. Hard pass.

I pivoted to something web-based instead.

The Little Web App I Ended Up With

I went with Flask because it’s basically zero ceremony—I can have a local server running in seconds, everything stays in pure Python, and I can use Jinja templates without pulling in a huge framework. For styling, I just grabbed Bootstrap so it looks decent without me having to think too hard about CSS.

The code lives in a few small files:

  • The server: access_to_csv/webapp.py
  • Templates:
    • index.html – the main form
    • outputs.html – list of generated CSVs
    • view_csv.html – a simple table viewer

The workflow is dead simple: open the page, pick the Access database file, pick an output folder, and click “Run.” When it’s done, you’re redirected to a page that lists all the CSVs, with buttons to view or download them. Click “View” and you get a paginated table with a search box—good enough to poke around without opening Excel.

Making It Feel Native on macOS

Manually typing long file paths got old fast, so I added a couple of endpoints that pop up the native macOS file/folder picker using AppleScript:

  • /pick-file for the Access database
  • /pick-folder for the output directory

The form includes “Browse…” buttons that, via JavaScript, hit those endpoints and auto-fill the fields. If you’re running it on Windows or Linux, the buttons just hide themselves, and you can paste paths the old-fashioned way—no big deal.

How I Actually Run It

I keep everything local and lightweight:

bash
source .venv/bin/activate
python -m access_to_csv.webapp
# then open http://127.0.0.1:5000 in my browser

If port 5000 is busy (thanks, something-else-on-my-mac), I just override it:

bash
ACCESS2CSV_PORT=5001 python -m access_to_csv.webapp

Browsing the CSVs Without Loading Everything

I definitely didn’t want to slurp a million-row CSV into memory just to look at the first few rows. So the viewer streams the file, shows one page at a time, and includes:

  • A quick search that scans across all columns in the current page
  • Adjustable page size
  • Prev/next buttons
  • A direct download link

It’s more than enough for spot-checking data or showing someone a sample.

What I Took Away From This

The nicest part is having both options. When I’m batch-processing a bunch of files or scripting something, I’ll just use the CLI. When I’m exploring a new database or handing it off to a teammate, I fire up the web UI and click around. All the heavy lifting lives in one shared export_database() function, so both interfaces stay in sync without any duplication.

In the end, I can now go from a random .accdb file to a folder full of browsable CSVs in under a minute, and I don’t have to walk anyone through complicated setup steps. Just install a couple Python packages, run the script, open a browser tab—done.

It feels like the right balance of simple and useful, and honestly, I’ve been using the web version way more than I expected.

author avatar
Chad Michel Chief Technology Officer
Chad is a lifelong Nebraskan. He grew up in rural Nebraska and now lives in Lincoln. Chad and his wife have a son and daughter.

Related posts