Parsowanie pliku CSV

Pliki csv są plikami tekstowymi, w których każdy wiersz reprezentuje jeden rekord danych, a poszczególne dane w wierszu są przedzielone delimiterem, najczęściej znakiem przecinka.

W poniższym przykładzie parsujemy plik raportu tankowań ze stacji paliwowej. Pierwszy wiersz jest nagłówkiem i zawiera dane: Dane Kontrahenta;Imie;Nazwisko;Numer Korekty;Numer WZ;Data;Godzina;Licznik;Stacja;Numer Rejestracyjny;Numer Karty;Nazwa towaru;VAT procent;Cena na stacji;Cena netto;Cena brutto;Wartość rabatu;Ilość;Netto;VAT;Brutto. W tym konkretnym przypadku delimiterem jest znak średnika. Kolejne wiersze będą zawierały wpisy o kolejnych tankowaniach. Chcemy uzyskać z pliku źródłowego dane o dacie tankowania, numerze rejestracyjnym auta i pobraną ilość litrów paliwa.

import csv

with open('raport.csv') as csv_file:
    csv_reader = csv.DictReader(csv_file, delimiter=';')
    total = 0
    for line in csv_reader:
        print('{}  {}  {} ltr'.format(
            line['Data'], line['Numer Rejestracyjny'], line['Ilość']))

        total += float((line['Ilość']).replace(',', '.'))
    print('Total: ', total, 'ltr')

    with open('NOWE_ZESTAWIENIE.csv', 'w') as new_csv_file:
        field_names = ['Data', 'Auto', 'Tankowanie']
        csv_writer = csv.DictWriter(
            new_csv_file, fieldnames=field_names, delimiter=';')
        csv_writer.writeheader()
        csv_file.seek(0)
        next(csv_reader)
        for line in csv_reader:
            dict = {}
            dict['Data'] = line['Data']
            dict['Auto'] = line['Numer Rejestracyjny']
            dict['Tankowanie'] = line['Ilość']
            csv_writer.writerow(dict)

Parsowanie dokonujemy przy użyciu modułu csv. Następnie używając menadżera kontekstu otwieramy do odczytu plik raport.csv ze stacji paliwowej. Do odczytu używamy obiekt DictReader, dzięki czemu będzie można odwoływać się do wartości poprzez podanie kluczy z nagłówka pliku csv. Następnie obliczona jest wartość total – całkowita ilość pobranego paliwa w okresie objętym w raporcie (poszczególne dane o tankowaniach są rzutowane na wartość float, przy czym polski zapis części dziesiętnej z przecinkiem jest zamieniany na zapis z kropką).

Pozyskane dane o tankowaniach zapisujemy w pliku NOWE_ZESTAWIENIE.csv. W tym przypadku używamy obiekt DictWriter. Aby jeszcze raz skorzystać z iteratora należy ustawić wskaźnik zawartości pliku na początek pliku – csv_file.seek(0). Domyślne nagłówki zastępujemy nowymi, zawartymi w liście field_names, dlatego konieczne jest przeskoczenie do nowej wartości iteratora poprzez wykonanie next(csv_reader). Nowy wiersz zapisujemy w pliku za pomocą metody writerow() obiektu csv.DictWriter.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *