Manipulação de Arquivos#
Em praticamente qualquer projeto de análise de dados, você precisará ler dados de algum lugar (arquivos CSV, planilhas Excel, bancos de dados, APIs…) e, eventualmente, salvar os resultados da sua análise. Python oferece ferramentas para lidar com essa tarefa de forma eficiente e elegante.
Por que é importante?
Dados raramente vêm “prontos”: A maioria dos dados brutos reside em arquivos. Saber como acessá-los é o primeiro passo crucial.
Preparação de Dados: A manipulação de arquivos permite a limpeza, transformação e preparação dos dados para modelagem.
Persistência de Resultados: Você precisará salvar seus resultados (gráficos, modelos treinados, insights) para uso futuro ou compartilhamento.
Automação: A capacidade de automatizar o processo de leitura e escrita de arquivos é essencial para pipelines de dados robustos.
Objetivos de Aprendizagem
Ao final desta aula, você será capaz de:
Compreender os princípios básicos da manipulação de arquivos em Python
Trabalhar com arquivos para armazenar e processar dados
Aplicar boas práticas na manipulação de arquivos
Conceitos Básico#
Arquivo: Um arquivo é uma coleção organizada de dados armazenada em um dispositivo de armazenamento (disco rígido, SSD, etc.).
Caminho (Path): É a localização do arquivo no sistema de arquivos. Pode ser absoluto (ex:
/home/usuario/dados/meu_arquivo.csv
) ou relativo (ex:dados/meu_arquivo.csv
, que se refere a um arquivo dentro da pasta “dados” no diretório atual).
Abrindo e Fechando Arquivos#
Para trabalhar com arquivos em Python, é fundamental saber como abrir e fechar arquivos corretamente.
Função open()
#
A função open()
é utilizada para abrir um arquivo e retorna um objeto do tipo arquivo. Sua sintaxe básica é file_object = open("nome_do_arquivo", "modo")
, onde:
nome_do_arquivo
: Especifica o caminho e o nome do arquivo a ser aberto.modo
: Determina a finalidade da abertura do arquivo (leitura, escrita, etc.).
Modos de Abertura#
Os modos mais comuns para abrir arquivos são:
'r'
: Modo de leitura. Abre um arquivo para leitura (padrão).'w'
: Modo de escrita. Cria um novo arquivo ou sobrescreve o existente para escrita.'a'
: Modo de anexação. Abre um arquivo para adicionar conteúdo ao final sem sobrescrever o existente.'b'
: Modo binário. Utilizado para arquivos binários, como imagens. Pode ser combinado com outros modos, como ‘rb’ ou ‘wb’.
arquivo = open("novo_arquivo.txt", "w")
Fechando Arquivos#
Após concluir as operações em um arquivo, é essencial fechá-lo para liberar recursos do sistema. Isso é feito com o método close()
:
arquivo.close()
Boa prática#
Uma prática recomendada é utilizar a estrutura with para abrir arquivos, garantindo que eles sejam fechados automaticamente após o bloco de código ser executado:
with open("nome_do_arquivo", "modo") as file_object:
# operações com o arquivo
# ...
O formato TXT é um dos mais simples e contém apenas texto puro. Ele é útil para armazenar logs, listas e dados simples sem estrutura tabular.
# Criando e escrevendo em um arquivo TXT
with open("arquivo.txt", "w") as arquivo:
arquivo.write("Olá, este é um arquivo de texto!\n")
arquivo.write("Cada linha pode armazenar informações diferentes.\n")
# Lendo um arquivo TXT
with open("arquivo.txt", "r") as arquivo:
conteudo = arquivo.read()
print(conteudo) # Exibe todo o conteúdo do arquivo
arq = open("vendas.txt", 'r')
Uma vez aberto, podemos realizar a leitura do arquivo usando as funções: read(n)
, readline()
ou readlines()
.
A função read(n)
lê até n
bytes. Caso o valor não seja informado, a função lê o arquivo inteiro. A função readline()
retorna uma string contendo a primeira linha do arquivo. Por fim, a função readlines()
retorna uma lista de strings, sendo cada elemento uma linha do arquivo.
linhas = arq.readlines()
type(linhas)
for linha in linhas:
print(linha)
arq = open("meu_arquivo.txt","w+")
linhasParaOArquivo = ["linha 1","linha 2","linha 3", "linha 4","linha 5"]
for l in linhasParaOArquivo:
arq.write(l)
arq.write("\n")
arq.close()
Escrevendo em arquivos TXT#
write(string)
: A função write()
escreve uma string diretamente em um arquivo aberto. É importante lembrar que ela não adiciona automaticamente uma nova linha; você precisa incluir o caractere de nova linha (\n
) no final da string se desejar que cada escrita apareça em uma linha separada no arquivo. Esta função é ideal para escrever dados formatados ou mensagens simples em arquivos de texto.
with open("novo_arquivo.txt", "w") as arquivo:
arquivo.write("Esta é uma nova linha.\n") # Não esqueça do \n para quebrar linha
arquivo.write("Outra linha aqui.")
writelines(lista_de_strings)
: Similar a write()
, mas aceita uma lista de strings como argumento. Cada string na lista será escrita em uma linha separada no arquivo. Novamente, você deve garantir que cada string na lista termine com um caractere de nova linha (\n
) se desejar que elas apareçam em linhas distintas no arquivo final. É eficiente para escrever múltiplos dados relacionados em sequência.
linhas = ["Linha 1\n", "Linha 2\n"]
with open("outro_novo_arquivo.txt", "w") as arquivo:
arquivo.writelines(linhas)
Manipulando Arquivos CSV#
CSV (Comma Separated Values) é um formato incrivelmente comum para armazenar dados tabulares. Pense neste tipo de arquivo como planilhas simples, onde cada linha representa uma observação e as colunas são separadas por vírgulas (ou outro delimitador). Em Ciência de Dados, você frequentemente encontrará seus dados em arquivos CSV, então dominá-los é essencial.
O que torna o CSV tão popular?
Simplicidade: A estrutura é fácil de entender e gerar.
Compatibilidade: Praticamente todos os softwares de análise de dados (Excel, Google Sheets, Pandas) conseguem ler e escrever arquivos CSV.
Portabilidade: Arquivos CSV são facilmente transferíveis entre diferentes sistemas e plataformas.
Python e o Módulo csv
#
O módulo csv
do Python oferece as ferramentas necessárias para trabalhar com arquivos CSV de forma eficiente e segura. Vamos explorar como ler e escrever esses arquivos.
import csv
# Abrindo o arquivo CSV para leitura:
with open('meu_arquivo.csv', 'r', encoding='utf-8') as arquivo_csv: # Especificar a codificação é importante!
# Criando um objeto leitor CSV:
leitor = csv.reader(arquivo_csv, delimiter=',') # O delimitador padrão é a vírgula
# Iterando sobre cada linha do arquivo:
for linha in leitor:
print(linha) # Cada 'linha' é uma lista de strings representando as colunas
open(...)
: Abre o arquivo CSV no modo leitura ('r'
). É crucial especificar a codificação (ex:encoding='utf-8'
) para lidar corretamente com caracteres especiais.csv.reader(arquivo_csv, delimiter=',')
: Cria um objeto leitor que itera sobre as linhas do arquivo CSV. O argumentodelimiter
especifica o caractere usado para separar os valores (a vírgula é o padrão). Você pode usar outros delimitadores como ponto e vírgula (;
) ou tabulação (\t
).for linha in leitor:
: Itera sobre cada linha do arquivo. Cadalinha
é uma lista de strings, onde cada string representa um valor em uma coluna.
Escrevendo em arquivos CSV#
writerow(sequencia)
(do módulo csv
): Esta função, fornecida pelo módulo csv
, é específica para arquivos CSV (Comma Separated Values). Ela escreve uma única linha de dados no arquivo CSV, onde cada elemento da sequência
se torna um campo separado por vírgula (ou outro delimitador especificado). É a maneira mais conveniente e correta de escrever dados em formato CSV.
import csv
# Dados a serem escritos no arquivo CSV:
dados = [
['Nome', 'Idade', 'Cidade'], # Cabeçalho (opcional)
['Alice', 30, 'Nova York'],
['Bob', 25, 'Los Angeles']
]
# Abrindo o arquivo CSV para escrita:
with open('novo_arquivo.csv', 'w', newline='', encoding='utf-8') as arquivo_csv: #newline='' evita linhas extras no Windows
# Criando um objeto escritor CSV:
escritor = csv.writer(arquivo_csv, delimiter=',')
# Escrevendo todas as linhas de uma vez:
escritor.writerows(dados)
open(...)
: Abre o arquivo CSV no modo escrita ('w'
). O argumentonewline=''
é importante para evitar linhas em branco extras, especialmente no Windows. A codificação também deve ser especificada.csv.writer(arquivo_csv, delimiter=',')
: Cria um objeto escritor que permite escrever dados no arquivo CSV. O argumentodelimiter
define o caractere separador (vírgula por padrão).escritor.writerows(dados)
: Escreve todas as linhas de uma vez. O argumentowriterows()
aceita uma lista de listas, onde cada sublista representa uma linha no arquivo CSV.
Trabalhando com arquivos JSON#
JSON (JavaScript Object Notation) é um formato leve de intercâmbio de dados, amplamente utilizado para transmitir informações entre servidores e aplicações web. Sua estrutura hierárquica baseada em pares chave-valor o torna fácil de ler e interpretar por humanos e máquinas. Em Ciência de Dados, você frequentemente encontrará APIs que retornam dados no formato JSON ou precisará salvar estruturas de dados complexas em um arquivo JSON.
Por que usar JSON?
Legibilidade: A estrutura é relativamente simples e fácil de entender.
Universalidade: Suportado por diversas linguagens de programação, incluindo Python.
Flexibilidade: Pode representar uma variedade de estruturas de dados, como listas, dicionários (objetos) e valores primitivos.
Python e o Módulo json
#
O módulo json
do Python fornece as ferramentas para trabalhar com arquivos JSON de forma eficiente. Vamos explorar como ler e escrever esses arquivos.
Leitura de Arquivos JSON#
import json
# Abrindo o arquivo JSON para leitura:
with open('meu_arquivo.json', 'r', encoding='utf-8') as arquivo_json:
# Carregando os dados do arquivo JSON em um objeto Python (geralmente um dicionário ou lista):
dados = json.load(arquivo_json)
# Imprimindo os dados carregados:
print(dados)
import json
: Importa o módulojson
.open(...)
: Abre o arquivo JSON no modo leitura ('r'
). É crucial especificar a codificação (ex:encoding='utf-8'
) para lidar corretamente com caracteres especiais.json.load(arquivo_json)
: Carrega os dados do arquivo JSON e converte em um objeto Python. Geralmente, o resultado será um dicionário ou uma lista de dicionários.
Escrita de Arquivos JSON#
import json
# Dados a serem escritos no arquivo JSON (geralmente um dicionário ou lista):
dados = {
"nome": "Alice",
"idade": 30,
"cidade": "Nova York",
"interesses": ["Ciência de Dados", "Machine Learning"]
}
# Abrindo o arquivo JSON para escrita:
with open('novo_arquivo.json', 'w', encoding='utf-8') as arquivo_json:
# Convertendo o objeto Python em uma string JSON e escrevendo no arquivo:
json.dump(dados, arquivo_json, indent=4) # indent=4 formata a saída para melhor legibilidade
open(...)
: Abre o arquivo JSON no modo escrita ('w'
). A codificação deve ser especificada.json.dump(dados, arquivo_json, indent=4)
: Converte o objeto Python (geralmente um dicionário ou lista) em uma string JSON e escreve no arquivo. O argumentoindent
formata a saída para melhor legibilidade, adicionando espaços de indentação.
Dicas e Considerações:
Estrutura dos Dados: Certifique-se de que os dados que você está tentando escrever sejam compatíveis com o formato JSON (dicionários, listas, strings, números, booleanos,
null
).Codificação: Sempre especifique a codificação correta do arquivo (geralmente UTF-8) para evitar problemas com caracteres especiais.
Indentação: Use o argumento
indent
emjson.dump()
para formatar a saída JSON de forma legível.json.dumps()
vs.json.dump()
:json.dumps()
converte um objeto Python em uma string JSON, enquantojson.dump()
escreve diretamente em um arquivo.
Exercícios Teóricos#
1. Modos de Leitura:
a) Explique a diferença entre os modos
'r'
,'w'
e'a'
ao abrir um arquivo em Python. Em que situações você usaria cada um deles?b) O que acontece se você tentar abrir um arquivo existente no modo
'w'
? Qual o impacto disso nos dados já existentes no arquivo?c) Descreva a importância do argumento
encoding
na funçãoopen()
. Por que é crucial especificar a codificação correta ao ler ou escrever arquivos de texto? Dê exemplos de codificações comuns.d) O que significa “seek” em relação a um arquivo aberto? Como o método
file.seek(offset, from_what)
funciona e para que ele pode ser usado?
2. Formatos de Arquivo:
a) Compare e contraste os formatos CSV e JSON como meios de armazenar dados. Quais são as vantagens e desvantagens de cada um em termos de legibilidade, estrutura e portabilidade?
b) Em qual cenário você escolheria usar o módulo
csv
do Python para manipular arquivos? E quando você usaria o módulojson
?c) Imagine que você precisa ler um arquivo CSV muito grande que não cabe na memória RAM. Quais estratégias você pode empregar para processar esse arquivo de forma eficiente? (Pense em iteração linha a linha, geradores, etc.)
d) Explique por que é importante usar o argumento
newline=''
ao abrir um arquivo CSV no modo escrita ('w'
) no Windows.
3. Boas Práticas:
a) Por que é recomendado usar a instrução
with open(...) as arquivo:
para trabalhar com arquivos em Python? Quais são os benefícios dessa abordagem em relação à abertura e fechamento manual de arquivos?b) Descreva o conceito de “tratamento de exceções” (try…except) no contexto da manipulação de arquivos. Por que é importante implementar tratamento de exceções ao ler ou escrever arquivos? Dê exemplos de possíveis erros que podem ocorrer.
c) Explique a importância de validar os dados lidos de um arquivo antes de usá-los em seu programa. Quais tipos de validação você pode realizar?
d) Você está escrevendo uma função para processar arquivos CSV. Como você garantiria que sua função seja reutilizável e flexível, permitindo que ela funcione com diferentes arquivos CSV (por exemplo, com delimitadores ou codificações diferentes)?
4. Cenários Práticos:
a) Você precisa ler um arquivo de log contendo informações sobre eventos do sistema. O arquivo é muito grande e você só precisa encontrar as linhas que contêm uma determinada palavra-chave. Como você abordaria essa tarefa de forma eficiente?
b) Você está desenvolvendo uma aplicação web que recebe dados dos usuários em formato JSON e os armazena em um banco de dados. Descreva o fluxo de trabalho, desde a recepção dos dados até o armazenamento no banco de dados, incluindo as etapas de validação e tratamento de erros.
c) Imagine que você precisa criar um script para converter arquivos CSV em arquivos JSON. Quais seriam os passos principais do seu script?
Exercícios para Praticar#
Crie um programa que lê um arquivo de texto
meu_texto.txt
e conta quantas palavras ele contém. Requisitos:Considere que as palavras estão separadas por espaços.
Exiba o total de palavras ao final.
Escreva um programa que permita ao usuário adicionar mais texto ao arquivo
meu_texto.txt
sem apagar o conteúdo existente. O programa deve utilizar o modo de abertura “a” (anexação).Crie um programa que solicita ao usuário o nome de um arquivo de texto (.txt). O programa deve abrir esse arquivo e contar quantas linhas ele contém. Requisitos:
O usuário deve fornecer o nome do arquivo (exemplo: meutexto.txt).
O programa deve exibir o número total de linhas no arquivo.
Análise de Log de Acesso Web (CSV): Considere o cenário a seguir. Você trabalha como analista de dados para uma empresa de e-commerce. Recebeu um arquivo CSV contendo logs de acesso ao site, com informações sobre o endereço IP, data/hora do acesso, página visitada e código de status HTTP. Precisa identificar os 10 endereços IP que mais acessaram o site durante um determinado período (ex: último mês). Crie manualmente um arquivo CSV com o conteúdo abaixo. Escreva um script Python que leia o arquivo CSV, filtre os acessos realizados nos dias 26 e 27 de Outubro (assumindo que a data/hora está no formato YYYY-MM-DD HH:MM:SS), conte a frequência de cada endereço IP e imprima o IP mais frequentes.
Conteúdo do arquivo CSV:
ip,data_hora,pagina,status
192.168.1.10,2023-10-26 10:00:00,/home,200
10.0.0.5,2023-10-26 10:05:00,/produto/123,200
192.168.1.10,2023-10-26 10:10:00,/contato,301
172.16.0.1,2023-10-26 10:15:00,/sobre,200
192.168.1.10,2023-10-27 09:00:00,/home,200
10.0.0.5,2023-10-27 09:05:00,/produto/456,404
172.16.0.1,2023-10-27 09:10:00,/blog,200
192.168.1.10,2023-10-28 11:00:00,/home,200
10.0.0.5,2023-10-28 11:05:00,/produto/789,200
172.16.0.1,2023-10-28 11:10:00,/servicos,200
Conversão de Dados de Clientes (JSON para CSV): Uma equipe de vendas gerou uma lista de clientes em formato JSON, mas o sistema interno da empresa, um CRM, só aceita dados no formato CSV. Você precisa converter os dados do arquivo JSON para um arquivo CSV compatível com o CRM. Crie manualmente um arquivo JSON com o conteúdo abaixo. Escreva um script Python que leia o arquivo JSON, converta os dados para o formato CSV e salve em um novo arquivo chamado clientes.csv. Inclua cabeçalhos nas colunas do CSV (nome, email, telefone).
Conteúdo do arquivo JSON:
[
{
"nome": "João da Silva",
"email": "joao@example.com",
"telefone": "11999999999"
},
{
"nome": "Maria Souza",
"email": "maria@example.com",
"telefone": "21888888888"
},
{
"nome": "Pedro Oliveira",
"email": "pedro@example.com",
"telefone": "31777777777"
}
]
Mini-projeto: Cifrando um arquivo com a Cifra de César.#
Introdução#
A Cifra de César é um dos métodos de criptografia mais antigos e simples. Ela funciona deslocando cada letra do texto original um número fixo de posições no alfabeto.
Por exemplo, se utilizarmos um deslocamento de 3 posições:
A letra “A” se torna “D”
A letra “B” se torna “E”
A palavra “PYTHON” se torna “SBWKRQ”
Este método é uma forma simples de ocultar informações e é um ótimo exercício para manipulação de strings e arquivos em Python.
Descrição do Exercício#
Escreva um programa que:
Solicita ao usuário o nome de um arquivo de texto (
.txt
) para ser lido.Solicita ao usuário um número inteiro que representará o deslocamento da Cifra de César.
Lê o conteúdo do arquivo e cifra o texto usando a Cifra de César.
Salva o texto cifrado em um novo arquivo chamado
arquivo_cifrado.txt
.
Requisitos#
O programa deve ler um arquivo e criptografar seu conteúdo utilizando a Cifra de César.
O deslocamento deve ser definido pelo usuário.
Apenas letras do alfabeto devem ser cifradas. Números, espaços e pontuações devem permanecer inalterados.
O programa deve salvar o texto cifrado em um novo arquivo sem modificar o original.
Exemplo de Entrada e Saída#
Arquivo de Entrada (mensagem.txt
)
Python é uma linguagem incrível!
Usuário digita:
Digite o nome do arquivo: mensagem.txt
Digite o deslocamento: 3
Arquivo Gerado (arquivo_cifrado.txt
)
Sbwkrq é xpd odqjxdjhp lqfuyháv!
Conclusão#
Exploramos os conceitos de módulos e Pacotes. Compreender como organizar seu código em unidades reutilizáveis e aproveitar o poder de Pacotes externas é crucial para se tornar um desenvolvedor Python eficiente e produtivo.
O que aprendemos hoje?#
Exploramos os conceitos fundamentais da manipulação de arquivos em Python, abordando como ler, escrever e modificar arquivos simples. Compreendemos a importância desses formatos para o armazenamento e troca de informações, além de aprender boas práticas para trabalhar com arquivos de maneira eficiente e segura.
Próximos Passos#
Resolva os problemas na seção “Exercícios para Praticar”.
Explorar formas de tratar erros comuns ao trabalhar com arquivos, como arquivos inexistentes ou problemas de codificação.