Google+ Followers

woensdag 9 december 2015

CSV inlezen met Python

Python heeft natuurlijk CSV functies, maar in tegenstelling tot PHP heeft Python ook standaard een Sniffer class die het formaat van een CSV bestand kan analyseren. Dat betekent dat je voor goed-geformatteerde CSV bestanden niet meer hoeft op te  geven welke scheidingsteken en welke quote er wordt gebruikt.

Een voorbeeldje:

import csv


class MyCSVReader():
    @staticmethod
    def read(filename):
        with open(filename, 'r') as csvfile:
            # Detecteer het scheidingsteken en de gebruikte quotes.
            dialect = csv.Sniffer().sniff(csvfile.read(1024))

            # Breng de filepointer van het bestand terug naar het begin
            # zodat het niet opnieuw geopend hoeft te worden.
            csvfile.seek(0)

            # Maak een csv reader met het gevonden dialect
            my_reader = csv.reader(csvfile, dialect)

            # Sla de header over
            next(my_reader)

            # Lees de rest van het bestand.
            rows = []
            for row in my_reader:
                # Print de eerste twee kolommen en vat kolommen 3 t/m 6 (2 t/m 5) samen in een string die PostgreSQL begrijpt als een "int[][]".
                rows.append([row[0], row[1], '{' + ','.join(row[2:5]) + '}'])
            return rows


def main():
    print('-'*20)
    rows = MyCSVReader.read('komma_tick.csv')
    for r in rows:
        print(r)

    print('-'*20)
    rows = MyCSVReader.read('puntkomma_dubbelquote.csv')
    for r in rows:
        print(r)


# Vertel de commandline-interpreter van Python dat hij moet beginnen met uitvoeren bij de main() functie.
if __name__ == '__main__':
    main()


"""
Inhoud van "puntkomma_doublequote.csv":
"greeting";"test number";"value a";"value b";"value c";"value d"
"hello";1;7;9;6;4
"hi";1;5;8
"goodbye";87;8;7;9;2

Inhoud van "komma_tick.csv"
'greeting','test number','value a','value b','value c','value d'
'hello',1,7,9,6,4
'hi',1,5,8
'goodbye',87,8,7,9,2
"""