csv.DictWriter()

CSV-fail ehk andmetega tabel visuaalselt.

../../_images/excel.jpg

Selliseid andmeid aitab palju loetavamaks teha csv.writer() funktsiooni modifikatsioon csv.DictWriter(), kus võtmed on pealkirjad, mis võivad omada palju erinevaid väärtusi.

Andmete vormistamine:

Kui csv.writer() eeldab, et andmed on järjendi kujul

ferrari_data = [
    ['model name', 'tank size (liters)', 'horsepower', 'cost (dollars)']
    ['Ferrari Daytona', 86, 829, 2226935],
    ['Ferrari Testarossa', 115, 385, 1355014],
    ['Ferrari LaFerrari', 86, 949, 3104231]
]

siis csv.DictWriter tahab andmed sõnastiku kujul

data = [
    {'model name': 'Ferrari Daytona', 'tank size (liters)': '86', 'horsepower': '829', 'cost (dollars)': '2226935'},
    {'model name': 'Ferrari Testarossa', 'tank size (liters)': '115', 'horsepower': '385', 'cost (dollars)': '1355014'},
    {'model name': 'Ferrari LaFerrari', 'tank size (liters)': '86', 'horsepower': '949', 'cost (dollars)': '3104231'},
]

Pealkirjade lisamine:

Kui csv.writerow puhul on asi lihtne, pealkiri lisatakse järjendina nagu ülejäänudki read

writer = csv.writerow(['model name', 'tank size (liters)', 'horsepower','cost (dollars)'])

siis csv.DictWriter() tahab csv.writeheader meetodit väljakutsudes ka ilmtingimata näha pealkirjad fieldnames argumendina-

writer = csv.DictWriter(csvfile, fieldnames=('model name', 'tank size', 'litres', 'horsepower', 'cost (dollars)'))
writer.writeheader()

Sama asi ilusamalt

fieldnames = ['model name', 'tank size', 'litres', 'horsepower', 'cost (dollars)']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()

Faili kirjutamine ja lugemine:

Ülejäänud read kirjutatakse mõlemal juhul kasutades meetodit writer.writerows(data), kus data on meie andmete järjendi nimi. Isegi andmete lugemine on pea sama, peab ainult csv.reader vahetama csv.DictReader funktsiooni vastu.

csv.DictWriter() funktsiooni täielik näide:

import csv

data = [
    {'model name': 'Ferrari Daytona', 'tank size': '829', 'liters': '86', 'horsepower': '829', 'cost (dollars)': '2226935'},
    {'model name': 'Ferrari Testarossa', 'tank size': '115', 'liters': '115', 'horsepower': '385', 'cost (dollars)': '1355014'},
    {'model name': 'Ferrari LaFerrari', 'tank size': '949', 'liters': '86', 'horsepower': '949', 'cost (dollars)': '3104231'},
]

with open('ferrari.csv', 'w', newline='') as csvfile:
    fieldnames = ['model name', 'tank size', 'litres', 'horsepower', 'cost (dollars)']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerows(data)

Sõnastiku eelis - vaid valitud võtmete kirjutamine

Et mitte kirjutada kõiki võtmed ja nende väärtusi CSV-faili, saab kasutada extrasaction='ignore' lisaargumenti:

import csv

data = [
    {'name': 'Porsche Cayenne', 'top_speed': 152, 'come_out_year': 2002},
    {'name': 'Porsche Speedster', 'top_speed': 192, 'come_out_year': 1954},
    {'name': 'Porsche Turbo', 'top_speed': 205, 'come_out_year': 1975}
]

fieldnames = ['name', 'top_speed']  # 'come_out_year' jäetakse välja

with open('porsches.csv', mode='w', newline='') as file:
    writer = csv.DictWriter(file, fieldnames=fieldnames, extrasaction='ignore')

    writer.writeheader()
    writer.writerows(data)

Järjenditest sõnastike tegemine zip funktsiooniga

Just zip funktsioon aitab järjendeid panna sõnastikkudesse, sest kombineerib indeksi järgi vasakult-paremale loetud järjendiread hoopis ülevalt-alla loetavateks ennikuridadeks.

import csv

names = ['McLaren Senna', 'McLaren Speedtail', 'McLaren Elva']
weights = [2641, 3305, 2531]
fuels = ['gasoline', 'battery', 'petrol']

combined_data = zip(names, weights, fuels)

with open('data.csv', 'w', newline='') as file:
    fieldnames = ['model_name', 'car_weight', 'fuel_type']
    writer = csv.DictWriter(file, fieldnames=fieldnames)

    for name, weight, fuel in combined_data:
        writer.writerow({'model_name': name, 'car_weight': weight, 'fuel_type': fuel})