Escrita e leitura de arquivos csv em Python
Primeiros passos na criação e interpretação de dados em arquivo
A Ciência de Dados tem como principal objetivo extrair informações a partir dos dados. Previsão de demanda e obtenção de insights sobre o perfil do cliente são alguns exemplos. É a partir dos dados que análises estatísticas e aplicação de técnicas de machine learning são desenvolvidas. Todo dado digital necessariamente possui um formato, e neste artigo trataremos do CSV.
O formato CSV(Comma Separated Value), armazena os dados separados por vírgulas em cada linha do arquivo. Sua descrição completa encontra-se na RFC 4180. Neste formato os dados são apresentados em forma tabular. Segue abaixo um exemplo do conteúdo de um arquivo csv.
Nome, Matrícula, AV1, AV2
Andressa Marques, 01222019, 5.0, 6.5
Bruno Farias, 01402019, 4.5, 5.2
Fernanda Vasconcelos, 01012019, 7.0, 5.6
Diego Braga, 01502019, 9.8, 4.0
Edson Jacques, 01452019, 5.0, 10.0
Larissa Fernandes, 01412019, 6.0, 7.5
O conteúdo deste arquivo pode ser lido em qualquer editor de texto, tais como gedit e notepad. Em alguns casos a leitura pode se tornar difícil, principalmente quando há muitas linhas e colunas. Uma maneira mais fácil de visualizar o conteúdo é adotando o formato de tabela.
Uma tabela é uma forma elegante de apresentar dados. Na Tabela 1, a primeira linha representa o cabeçalho, informando o nome das variáveis armazenadas em cada coluna. As demais linhas representam os registros, cada um deles contém o nome que identifica o aluno, sua matrícula e as notas obtidas na primeira(AV1) e segunda(AV2) avaliação.
Atualmente, praticamente toda aplicação que se encontra na pipeline de análise de dados realiza importação e exportação de arquivos no formato csv. Temos, por exemplo, os bancos de dados relacionais (ex: MySQL e Postgres), as planilhas digitais (ex: Excel) e os dashboards (ex: PowerBI e Tableau). As linguagens de programação mais comuns, tais como Python, JavaScript e C++, possuem suporte para leitura e escrita de arquivos csv.
Estudo de caso: Controle de processo industrial
Afim de contextualizar os dados, proponho um exemplo genérico de controle industrial. Uma cabine tem 3 variáveis controladas por sensores: temperatura, pressão e umidade relativa do ar. Cada sensor faz a leitura de sua respectiva variável e registra o valor em uma base de dados. Os dados registrados são exportados em arquivo e seu conteúdo é apresentado na Tabela 2.
Medidas de tempo como data e hora são bastante úteis em casos reais. Medidas físicas registradas podem ter estatísticas relacionadas ao tempo, como média e desvio padrão por dia ou hora. Esta informação é muito valiosa no suporte a tomada de decisão. Por estar além do escopo deste artigo, as medidas relacionadas ao tempo e possíveis análises serão desconsideradas.
Leitura de arquivos csv
Em python utilizamos o módulo csv para leitura e escrita de arquivos no formato csv. Este módulo é nativo, ou seja, não é necessário nenhuma instalação utilizando o gerenciador de pacotes pip.
Com o script acima e um arquivo csv com os dados da Tabela 2 no mesmo diretório, basta executar o script.
$ python readCSV.py
Quando se trata da leitura de um arquivo, a primeira coisa a ser feita é carregá-lo em memória. Por oferecer uma sintaxe elegante e tratamento de erros, o comando with open( ) as csv_file é uma boa alternativa ao conhecido open( ). Em todo o código indentado, o arquivo dados_industriais.csv é referenciado como csv_file.
A função csv.reader retorna um objeto que poderá ser iterado para obtenção das linhas do arquivo. O parâmetro delimiter informa o caractere utilizado para que o reader saiba delimitar cada coluna de uma mesma linha. Neste caso o delimitador é a vírgula. Em arquivos com cabeçalho, o mesmo pode ser ignorado na leitura ao realizar a chamada do método __next__() do reader antes de iterar sob todas as demais linhas do arquivo.
Como o csv_reader é um objeto iterável, todas as linhas do arquivo carregado podem ser lidas utilizando o comando for. A cada iteração as linhas são acessadas através de row, um vetor de strings de tamanho igual ao número de colunas do arquivo.
Uma outra forma de realizar a leitura, é acessar cada coluna como se fosse um dicionário de vetores. Com o objeto retornado pela função csv.DictReader, a leitura dos dados é feita de forma similar a um dicionário, tendo suas chaves definidas pelo parâmetro fieldnames.
Escrita de arquivos csv
A escrita de um arquivo csv consiste em três passos: criação do arquivo, criação do writer e, por último, a escrita de cada linha. Assim como a leitura, a escrita também requer a importação do módulo csv.
No processo de escrita são adicionados dois parâmetros ao comando with open( ) as csv_file, são eles: w indica que haverá escrita no arquivo e, diferente da leitura, o mesmo pode ser criado no momento em que o script é executado; newline=’ ‘ evita problemas de leitura em linhas que estão entre aspas simples, esta é uma recomendação data pela página oficial do módulo.
O objeto que escreve as linhas do arquivo é criado pela função csv.writer. Através do método writerow, que recebe como parâmetro o vetor contendo os dados, todas as linhas são escritas.
Outra forma e escrever em arquivos no formato csv é utilizando csv.DictWriter. Em sua criação é necessário que se especifique o cabeçalho. Identificado por fieldnames, estes campos serão a chave de cada dicionário passado no método writerow.
O método writeheader escreve o cabeçalho. Ocorrerá erro na tentativa de inserir um dicionário com chave que não está presente no vetor fieldnames. Mas no caso de inserção de dicionário sem uma das chaves indicadas em fieldnames, apenas implicará numa linha com dado faltante.
É provável que em casos reais se faça necessário um código mais elaborado, pois arquivos e dados reais geralmente possuem características particulares.
Em relação a leitura de arquivos, se a finalidade for gerar estatísticas dos dados, leve em consideração bibliotecas como Pandas, elas foram construídas e são mantidas justamente para atender este objetivo.
No processo de escrita, é muito comum casos onde o arquivo é criado a partir da leitura e pré-processamento de dados de diferentes fontes , sejam elas outros arquivos ou banco de dados.
Este artigo foi útil a você? Deixe seu feedback nos comentários, ele será valioso na preparação de outros textos para a comunidade.