Python Data Persistence - Modulo CSV

CSV stands for comma separated values. Questo formato di file è un formato di dati comunemente utilizzato durante l'esportazione / importazione di dati da / verso fogli di calcolo e tabelle di dati nei database. Il modulo csv è stato incorporato nella libreria standard di Python come risultato di PEP 305. Presenta classi e metodi per eseguire operazioni di lettura / scrittura su file CSV secondo le raccomandazioni di PEP 305.

CSV è un formato di dati di esportazione preferito dal software per fogli di calcolo Excel di Microsoft. Tuttavia, il modulo csv può gestire anche dati rappresentati da altri dialetti.

L'interfaccia dell'API CSV è composta dalle seguenti classi di scrittore e lettore:

scrittore()

Questa funzione nel modulo csv restituisce un oggetto writer che converte i dati in una stringa delimitata e li memorizza in un oggetto file. La funzione necessita di un oggetto file con autorizzazione di scrittura come parametro. Ogni riga scritta nel file emette un carattere di nuova riga. Per evitare spazio aggiuntivo tra le righe, il parametro di nuova riga è impostato su "".

La classe writer ha i seguenti metodi:

writerow ()

Questo metodo scrive gli elementi in un iterabile (elenco, tupla o stringa), separandoli dal carattere virgola.

writerows ()

Questo metodo accetta un elenco di iterabili, come parametro e scrive ogni elemento come una riga di elementi separati da virgole nel file.

Example

L'esempio seguente mostra l'uso della funzione writer (). Per prima cosa viene aperto un file in modalità "w". Questo file viene utilizzato per ottenere l'oggetto writer. Ogni tupla nell'elenco di tuple viene quindi scritta su file utilizzando il metodo 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

Questo creerà il file "persons.csv" nella directory corrente. Mostrerà i seguenti dati.

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

Invece di scorrere l'elenco per scrivere ogni riga individualmente, possiamo usare il metodo 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()

lettore()

Questa funzione restituisce un oggetto lettore che restituisce un iteratore di righe nel file csv file. Utilizzando il normale ciclo for, tutte le righe del file vengono visualizzate nel seguente esempio:

Esempio

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

Produzione

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

L'oggetto lettore è un iteratore. Quindi, supporta la funzione next () che può essere utilizzata anche per visualizzare tutte le righe nel file csv invece di un filefor loop.

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

Come accennato in precedenza, il modulo csv utilizza Excel come dialetto predefinito. Il modulo csv definisce anche una classe dialettale. Il dialetto è un insieme di standard utilizzati per implementare il protocollo CSV. L'elenco dei dialetti disponibili può essere ottenuto dalla funzione list_dialects ().

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

Oltre agli iterabili, il modulo csv può esportare un oggetto dizionario in un file CSV e leggerlo per popolare l'oggetto dizionario Python. A tale scopo, questo modulo definisce le seguenti classi:

DictWriter ()

Questa funzione restituisce un oggetto DictWriter. È simile all'oggetto writer, ma le righe vengono mappate all'oggetto dizionario. La funzione richiede un oggetto file con autorizzazione di scrittura e un elenco di chiavi utilizzate nel dizionario come parametro dei nomi di campo. Viene utilizzato per scrivere la prima riga del file come intestazione.

writeheader ()

Questo metodo scrive l'elenco delle chiavi nel dizionario come una riga separata da virgole come prima riga del file.

Nell'esempio seguente, viene definito un elenco di elementi del dizionario. Ogni elemento nell'elenco è un dizionario. Utilizzando il metodo writrows (), vengono scritti su file in modo separato da virgole.

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()

Il file persons.csv mostra i seguenti contenuti:

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

DictReader ()

Questa funzione restituisce un oggetto DictReader dal file CSV sottostante. Come, nel caso di un oggetto lettore, anche questo è un iteratore, utilizzando il contenuto del file che viene recuperato.

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

La classe fornisce l'attributo fieldnames, restituendo le chiavi del dizionario utilizzate come intestazione del file.

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

Usa il ciclo sull'oggetto DictReader per recuperare i singoli oggetti del dizionario.

for row in obj:
   print (row)

Ciò si traduce nel seguente output:

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

Per convertire un oggetto OrderedDict in un dizionario normale, dobbiamo prima importare OrderedDict dal modulo delle collezioni.

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