Skip to content

Instantly share code, notes, and snippets.

View sebastianknopf's full-sized avatar

Sebastian Knopf sebastianknopf

View GitHub Profile
@sebastianknopf
sebastianknopf / repeatedtimer.py
Created June 18, 2025 08:28
repeatedtimer.py
from threading import Timer
class RepeatedTimer(object):
def __init__(self, interval, function, *args, **kwargs):
self._timer = None
self.interval = interval
self.function = function
self.args = args
self.kwargs = kwargs
@sebastianknopf
sebastianknopf / dict2xml.py
Last active June 19, 2025 17:41
utility module to convert a python dict to XML
from lxml import etree
from lxml.etree import CDATA
from lxml.etree import QName
_CONST_ATTRIB_INDICATOR = '#'
def _build_xml_element(parent, d, wrap_lists, nsmap):
if isinstance(d, dict):
attrib = {}
content = {}
@sebastianknopf
sebastianknopf / basexml.py
Created May 19, 2025 15:32
Utility functions to work with objectified LXML data implemented in Python
import re
def exists(obj, path):
path = path.split('.')
level0 = path[0]
level1 = '.'.join(path[1:])
return obj is not None and hasattr(obj, level0) if len(path) == 1 else exists(getattr(obj, level0), level1) if hasattr(obj, level0) else False
@sebastianknopf
sebastianknopf / set-cover-gtfs.py
Last active May 13, 2025 10:06
Python implementation for a set-cover-problem: Which are the minimum stations to meet every trip of a GTFS dataset at least once?
import csv
import os
import re
import sys
from collections import defaultdict
from datetime import datetime
def reduce_ifopt(ifopt_id: str) -> str:
pattern = r"^[a-z]{2}:\d{5}:[\w\d]+(:[\w\d]+){0,2}$"
@sebastianknopf
sebastianknopf / datalog.py
Last active June 21, 2025 17:00
datalog.py
import json
import os
from datetime import datetime
from lxml.etree import fromstring
from lxml.etree import tostring
class Datalog:
@classmethod
@sebastianknopf
sebastianknopf / csv2ddb.py
Last active October 13, 2024 19:30
python helper script for memory efficient importing huge CSV files into a DuckDB database
import click
import csv
import duckdb
import polars
@click.command
@click.option('--file', '-f', help='Input CSV file')
@click.option('--db', '-d', help='DuckDB filename')
@click.option('--table', '-t', help='Destination table name to import the CSV file')
@click.option('--create-statement', '-c', default=None, help='Create statement filename for destination table')
@sebastianknopf
sebastianknopf / asc.py
Last active September 12, 2024 09:36
Python helper class to process *.asc files used in IVU.pool data for timetable exchange
import csv
import re
import os
from isa.ascdef import name2def
########################################################################################################################
# Helper class for reading and modifying *.asc files.
########################################################################################################################
@sebastianknopf
sebastianknopf / x10.py
Created August 1, 2024 08:41
Python helper class to process *.x10 files according to VDV-451
import csv
import re
########################################################################################################################
# Helper class for reading and modifying *.x10 files.
########################################################################################################################
def read_x10_file(filename):
x10_file = X10File()
x10_file.read(filename)
@sebastianknopf
sebastianknopf / offlinemaps.py
Created January 12, 2023 18:28
python script to fetch ZXY tiles from map servers
import os
import requests
import math
import zipfile
from optparse import OptionParser
# map server constants
MAP_SERVER_ADDRESS = '[YourMapServer]'
MAP_SERVER_USERNAME = ''
@sebastianknopf
sebastianknopf / objectunifier.py
Created May 11, 2022 21:03
unifies objects to a comparable (hash) string regardless of their spelling - use case: checking persons and addresses against a blacklist without storing personal data permanently in database
import hashlib
import re
import unittest
from abc import abstractmethod
class ObjectUnifier:
_token_list = []