Persistência de dados Python - Módulo CSV

CSV stands for comma separated values. Este formato de arquivo é um formato de dados comumente usado ao exportar / importar dados de / para planilhas e tabelas de dados em bancos de dados. O módulo csv foi incorporado à biblioteca padrão do Python como resultado do PEP 305. Apresenta classes e métodos para realizar operações de leitura / gravação em arquivo CSV conforme recomendações do PEP 305.

CSV é o formato de exportação de dados preferido pelo software de planilha Excel da Microsoft. No entanto, o módulo csv também pode lidar com dados representados por outros dialetos.

A interface da API CSV consiste nas seguintes classes de escritor e leitor -

escritor()

Esta função no módulo csv retorna um objeto de gravação que converte dados em uma string delimitada e os armazena em um objeto de arquivo. A função precisa de um objeto de arquivo com permissão de gravação como parâmetro. Cada linha escrita no arquivo emite um caractere de nova linha. Para evitar espaço adicional entre as linhas, o parâmetro de nova linha é definido como ''.

A classe de escritor tem os seguintes métodos -

escritorow ()

Este método grava itens em um iterável (lista, tupla ou string), separando-os por vírgula.

writerows ()

Este método pega uma lista de iteráveis, como parâmetro e grava cada item como uma linha separada por vírgula de itens no arquivo.

Example

O exemplo a seguir mostra o uso da função writer (). Primeiro, um arquivo é aberto no modo 'w'. Este arquivo é usado para obter o objeto gravador. Cada tupla na lista de tuplas é então escrita em um arquivo usando o método 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

Isso criará o arquivo 'people.csv' no diretório atual. Ele mostrará os dados a seguir.

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

Em vez de iterar a lista para escrever cada linha individualmente, podemos usar o método 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()

leitor()

Esta função retorna um objeto leitor que retorna um iterador de linhas no csv file. Usando o loop for regular, todas as linhas do arquivo são exibidas no exemplo a seguir -

Exemplo

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

Resultado

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

O objeto leitor é um iterador. Portanto, ele suporta a função next (), que também pode ser usada para exibir todas as linhas no arquivo csv em vez de umfor loop.

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

Conforme mencionado anteriormente, o módulo csv usa o Excel como seu dialeto padrão. O módulo csv também define uma classe de dialeto. Dialeto é um conjunto de padrões usados ​​para implementar o protocolo CSV. A lista de dialetos disponíveis pode ser obtida pela função list_dialects ().

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

Além dos iteráveis, o módulo csv pode exportar um objeto de dicionário para um arquivo CSV e lê-lo para preencher o objeto de dicionário Python. Para este efeito, este módulo define as seguintes classes -

DictWriter ()

Esta função retorna um objeto DictWriter. É semelhante ao objeto escritor, mas as linhas são mapeadas para o objeto dicionário. A função precisa de um objeto de arquivo com permissão de gravação e uma lista de chaves usadas no dicionário como parâmetro fieldnames. Isso é usado para escrever a primeira linha do arquivo como cabeçalho.

writeheader ()

Este método grava a lista de chaves no dicionário como uma linha separada por vírgulas como a primeira linha do arquivo.

No exemplo a seguir, uma lista de itens do dicionário é definida. Cada item da lista é um dicionário. Usando o método writrows (), eles são gravados em arquivos separados por vírgulas.

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

O arquivo people.csv mostra o seguinte conteúdo -

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

DictReader ()

Esta função retorna um objeto DictReader do arquivo CSV subjacente. Como, no caso de, objeto leitor, este também é um iterador, usando o qual o conteúdo do arquivo é recuperado.

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

A classe fornece o atributo fieldnames, retornando as chaves do dicionário usadas como cabeçalho do arquivo.

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

Use o loop sobre o objeto DictReader para buscar objetos de dicionário individuais.

for row in obj:
   print (row)

Isso resulta na seguinte saída -

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

Para converter o objeto OrderedDict para o dicionário normal, temos que primeiro importar OrderedDict do módulo de coleções.

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