import logging from pathlib import Path import csv logging.basicConfig(level=logging.INFO) def normalise(input, output, in_delimiter=None, in_quote=None): """Normalise `input` CSV file into `output` file.""" Path(output).touch(exist_ok=True) with Path(input).open("r", newline="") as in_file: dialect = csv.Sniffer().sniff(in_file.read()) if in_delimiter is None: in_delimiter = dialect.delimiter if in_quote is None: in_quote = dialect.quotechar with Path(input).open("r", newline="") as in_file, Path(output).open( "w" ) as out_file: reader = csv.reader(in_file, delimiter=in_delimiter, quotechar=in_quote) writer = csv.writer( out_file, delimiter=",", quotechar=in_quote, quoting=csv.QUOTE_MINIMAL, lineterminator="\n", ) for row in reader: row = [element.replace('"', '"""') for element in row] writer.writerow(row) if __name__ == "__main__": import argparse parser = argparse.ArgumentParser(description="Smol prog to normalise CSV files.") parser.add_argument("input") parser.add_argument("output") parser.add_argument("--in-delimiter", dest="in_delimiter", default=None) parser.add_argument("--in-quote", dest="in_quote", default=None) args = parser.parse_args() normalise( input=args.input, output=args.output, in_delimiter=args.in_delimiter, in_quote=args.in_quote, )