Python Data Persistence - moduł CSV

CSV stands for comma separated values. Ten format pliku jest powszechnie używanym formatem danych podczas eksportowania / importowania danych do / z arkuszy kalkulacyjnych i tabel danych w bazach danych. Moduł csv został włączony do standardowej biblioteki Pythona w wyniku PEP 305. Prezentuje klasy i metody wykonywania operacji odczytu / zapisu na pliku CSV zgodnie z zaleceniami PEP 305.

CSV jest preferowanym formatem eksportu danych przez oprogramowanie arkusza kalkulacyjnego Microsoft Excel. Jednak moduł csv może również obsługiwać dane reprezentowane przez inne dialekty.

Interfejs API CSV składa się z następujących klas pisarzy i czytelników -

pisarz()

Ta funkcja w module csv zwraca obiekt zapisujący, który konwertuje dane na rozdzielany ciąg i przechowuje w obiekcie pliku. Funkcja wymaga obiektu pliku z uprawnieniem do zapisu jako parametru. Każdy wiersz zapisany w pliku generuje znak nowej linii. Aby uniknąć dodatkowego odstępu między wierszami, parametr nowej linii jest ustawiony na „”.

Klasa pisarza ma następujące metody -

writerow ()

Ta metoda zapisuje elementy w postaci iterowalnej (lista, krotka lub ciąg), oddzielając je przecinkiem.

pisarze ()

Ta metoda przyjmuje listę elementów iterowalnych jako parametr i zapisuje każdy element jako oddzieloną przecinkami linię elementów w pliku.

Example

Poniższy przykład pokazuje użycie funkcji writer (). Najpierw plik jest otwierany w trybie „w”. Ten plik jest używany do uzyskiwania obiektu zapisującego. Każda krotka na liście krotek jest następnie zapisywana do pliku przy użyciu metody writerow ().

import csv
   persons=[('Lata',22,45),('Anil',21,56),('John',20,60)]
   csvfile=open('persons.csv','w', newline='')
   obj=csv.writer(csvfile)
   for person in persons:
      obj.writerow(person)
csvfile.close()

Output

Spowoduje to utworzenie pliku „people.csv” w bieżącym katalogu. Pokaże następujące dane.

Lata,22,45
Anil,21,56
John,20,60

Zamiast iterować po liście, aby zapisać każdy wiersz z osobna, możemy użyć metody writerows ().

csvfile=open('persons.csv','w', newline='')
persons=[('Lata',22,45),('Anil',21,56),('John',20,60)]
   obj=csv.writer(csvfile)
   obj.writerows(persons)
   obj.close()

czytelnik()

Ta funkcja zwraca obiekt czytnika, który zwraca iterator wierszy w csv file. Używając zwykłej pętli for, wszystkie wiersze w pliku są wyświetlane w następującym przykładzie -

Przykład

csvfile=open('persons.csv','r', newline='')
   obj=csv.reader(csvfile)
   for row in obj:
      print (row)

Wynik

['Lata', '22', '45']
['Anil', '21', '56']
['John', '20', '60']

Obiekt czytnika jest iteratorem. W związku z tym obsługuje funkcję next (), której można również użyć do wyświetlenia wszystkich wierszy w pliku csv zamiast plikufor loop.

csvfile=open('persons.csv','r', newline='')
   obj=csv.reader(csvfile)
   while True:
   try:
      row=next(obj)
      print (row)
   except StopIteration:
      break

Jak wspomniano wcześniej, moduł csv używa Excela jako domyślnego dialektu. Moduł csv definiuje również klasę dialektu. Dialect to zestaw standardów używanych do implementacji protokołu CSV. Listę dostępnych dialektów można uzyskać za pomocą funkcji list_dialects ().

>>> csv.list_dialects()
['excel', 'excel-tab', 'unix']

Oprócz elementów iterowalnych, moduł csv może eksportować obiekt słownika do pliku CSV i czytać go w celu wypełnienia obiektu słownika Pythona. W tym celu moduł ten definiuje następujące klasy -

DictWriter ()

Ta funkcja zwraca obiekt DictWriter. Jest podobny do obiektu pisarza, ale wiersze są mapowane na obiekt słownika. Funkcja wymaga obiektu pliku z uprawnieniami do zapisu oraz listy kluczy używanych w słowniku jako parametr nazw pól. Służy do zapisania pierwszej linii w pliku jako nagłówka.

writeheader ()

Ta metoda zapisuje listę kluczy w słowniku jako linię oddzieloną przecinkami jako pierwszą linię w pliku.

W poniższym przykładzie zdefiniowano listę elementów słownika. Każda pozycja na liście to słownik. Używając metody writrows (), są one zapisywane do pliku w sposób oddzielony przecinkami.

persons=[
   {'name':'Lata', 'age':22, 'marks':45}, 
   {'name':'Anil', 'age':21, 'marks':56}, 
   {'name':'John', 'age':20, 'marks':60}
]
csvfile=open('persons.csv','w', newline='')
fields=list(persons[0].keys())
obj=csv.DictWriter(csvfile, fieldnames=fields)
obj.writeheader()
obj.writerows(persons)
csvfile.close()

Plik people.csv zawiera następującą zawartość -

name,age,marks
Lata,22,45
Anil,21,56
John,20,60

DictReader ()

Ta funkcja zwraca obiekt DictReader z bazowego pliku CSV. Podobnie jak w przypadku obiektu reader, ten jest również iteratorem, za pomocą którego pobierana jest zawartość pliku.

csvfile=open('persons.csv','r', newline='')
obj=csv.DictReader(csvfile)

Klasa udostępnia atrybut fieldnames, zwracający klucze słownika używane jako nagłówek pliku.

print (obj.fieldnames)
['name', 'age', 'marks']

Użyj pętli nad obiektem DictReader, aby pobrać poszczególne obiekty słownika.

for row in obj:
   print (row)

Powoduje to następujący wynik -

OrderedDict([('name', 'Lata'), ('age', '22'), ('marks', '45')])
OrderedDict([('name', 'Anil'), ('age', '21'), ('marks', '56')])
OrderedDict([('name', 'John'), ('age', '20'), ('marks', '60')])

Aby przekonwertować obiekt OrderedDict do zwykłego słownika, musimy najpierw zaimportować OrderedDict z modułu collections.

from collections import OrderedDict
   r=OrderedDict([('name', 'Lata'), ('age', '22'), ('marks', '45')])
   dict(r)
{'name': 'Lata', 'age': '22', 'marks': '45'}