Your software is a direct reflection of your thinking. I had a quick look at your code and I don't know enough Python (I know nothing about the language to be honest) to say too much but your code looks like it was structured in accordance to a reasonably well thought out design. I wouldn't call your code "crappy" so you really shouldn't be calling your software "crappy" either.
It sounds like you needed a tool to get a simple one-off job done, and, it looks like that's what happened. That's a success in my book. The fact it's not a monster program doing all manner of useful things is testimony to your understanding of the importance of parsimony in design. The fact it crashes when you do things in the wrong order (as described in your comments in the code), well it's a one off and if you need reliability you can spend some time fixing it.
I think you're being too hard on yourself.