Introdução
A maioria dos programas precisa ler dados de algum lugar. Esta seção discute o acesso a arquivos.
Entrada e Saída de Arquivos
Abrir um arquivo.
f = open('foo.txt', 'rt') ## Open for reading (text)
g = open('bar.txt', 'wt') ## Open for writing (text)
Ler todos os dados.
data = f.read()
## Read only up to 'maxbytes' bytes
data = f.read([maxbytes])
Escrever algum texto.
g.write('some text')
Fechar quando terminar.
f.close()
g.close()
Arquivos devem ser fechados corretamente, e é fácil esquecer essa etapa. Portanto, a abordagem preferida é usar a instrução with, assim:
with open(filename, 'rt') as file:
## Use the file `file`
...
## No need to close explicitly
...statements
Isso fecha automaticamente o arquivo quando o controle sai do bloco de código indentado.
Idiomas Comuns para Leitura de Dados de Arquivos
Ler um arquivo inteiro de uma vez como uma string.
with open('foo.txt', 'rt') as file:
data = file.read()
## `data` is a string with all the text in `foo.txt`
Ler um arquivo linha por linha, iterando.
with open(filename, 'rt') as file:
for line in file:
## Process the line
Idiomas Comuns para Escrever em um Arquivo
Escrever dados de string.
with open('outfile', 'wt') as out:
out.write('Hello World\n')
...
Redirecionar a função print.
with open('outfile', 'wt') as out:
print('Hello World', file=out)
...
Estes exercícios dependem de um arquivo portfolio.csv. O arquivo contém uma lista de linhas com informações sobre uma carteira de ações. Assume-se que você está trabalhando no diretório ~/project/. Se você não tiver certeza, pode descobrir onde o Python acha que está executando fazendo o seguinte:
>>> import os
>>> os.getcwd()
'/home/labex/project' ## Output vary
>>>
Exercício 1.26: Preliminares de Arquivos
Primeiro, tente ler o arquivo inteiro de uma vez como uma grande string:
>>> with open('portfolio.csv', 'rt') as f:
data = f.read()
>>> data
'name,shares,price\n"AA",100,32.20\n"IBM",50,91.10\n"CAT",150,83.44\n"MSFT",200,51.23\n"GE",95,40.37\n"MSFT",50,65.10\n"IBM",100,70.44\n'
>>> print(data)
name,shares,price
"AA",100,32.20
"IBM",50,91.10
"CAT",150,83.44
"MSFT",200,51.23
"GE",95,40.37
"MSFT",50,65.10
"IBM",100,70.44
>>>
No exemplo acima, deve-se notar que o Python tem dois modos de saída. No primeiro modo, onde você digita data no prompt, o Python mostra a representação da string bruta, incluindo aspas e códigos de escape. Quando você digita print(data), você obtém a saída formatada real da string.
Embora ler um arquivo de uma vez seja simples, muitas vezes não é a maneira mais apropriada de fazê-lo - especialmente se o arquivo for enorme ou se contiver linhas de texto que você deseja manipular uma de cada vez.
Para ler um arquivo linha por linha, use um loop for como este:
>>> with open('portfolio.csv', 'rt') as f:
for line in f:
print(line, end='')
name,shares,price
"AA",100,32.20
"IBM",50,91.10
...
>>>
Quando você usa este código como mostrado, as linhas são lidas até que o final do arquivo seja alcançado, momento em que o loop para.
Em certas ocasiões, você pode querer ler ou pular manualmente uma única linha de texto (por exemplo, talvez você queira pular a primeira linha de cabeçalhos de coluna).
>>> f = open('portfolio.csv', 'rt')
>>> headers = next(f)
>>> headers
'name,shares,price\n'
>>> for line in f:
print(line, end='')
"AA",100,32.20
"IBM",50,91.10
...
>>> f.close()
>>>
next() retorna a próxima linha de texto no arquivo. Se você o chamasse repetidamente, obteria linhas sucessivas. No entanto, para que você saiba, o loop for já usa next() para obter seus dados. Assim, você normalmente não o chamaria diretamente, a menos que esteja tentando explicitamente pular ou ler uma única linha, como mostrado.
Depois de ler as linhas de um arquivo, você pode começar a realizar mais processamento, como divisão (splitting). Por exemplo, tente isto:
>>> f = open('portfolio.csv', 'rt')
>>> headers = next(f).split(',')
>>> headers
['name', 'shares', 'price\n']
>>> for line in f:
row = line.split(',')
print(row)
['"AA"', '100', '32.20\n']
['"IBM"', '50', '91.10\n']
...
>>> f.close()
Nota: Nestes exemplos, f.close() está sendo chamado explicitamente porque a instrução with não está sendo usada.
Exercício 1.27: Lendo um arquivo de dados
Agora que você sabe como ler um arquivo, vamos escrever um programa para realizar um cálculo simples.
As colunas em portfolio.csv correspondem ao nome da ação, número de ações e preço de compra de uma única participação acionária. Escreva um programa chamado pcost.py no diretório /home/labex/project que abra este arquivo, leia todas as linhas e calcule quanto custou a compra de todas as ações da carteira.
Dica: para converter uma string em um inteiro, use int(s). Para converter uma string em ponto flutuante, use float(s).
Seu programa deve imprimir uma saída como a seguinte:
Total cost 44671.15
Exercício 1.28: Outros tipos de "arquivos"
E se você quisesse ler um arquivo que não fosse de texto, como um arquivo de dados compactado com gzip? A função embutida open() não o ajudará aqui, mas o Python tem um módulo de biblioteca gzip que pode ler arquivos compactados com gzip.
Experimente:
>>> import gzip
>>> with gzip.open('portfolio.csv.gz', 'rt') as f:
for line in f:
print(line, end='')
... veja a saída ...
>>>
Observação: Incluir o modo de arquivo 'rt' é crucial aqui. Se você esquecer isso, obterá strings de bytes em vez de strings de texto normais.
Comentário: Não deveríamos estar usando Pandas para isso?
Cientistas de dados são rápidos em apontar que bibliotecas como Pandas já possuem uma função para ler arquivos CSV. Isso é verdade - e funciona muito bem. No entanto, este não é um curso sobre como aprender Pandas. Ler arquivos é um problema mais geral do que as especificidades dos arquivos CSV. A principal razão pela qual estamos trabalhando com um arquivo CSV é que ele é um formato familiar para a maioria dos codificadores e é relativamente fácil de trabalhar diretamente - ilustrando muitos recursos do Python no processo. Então, use Pandas quando voltar ao trabalho. Para o restante deste curso, no entanto, vamos nos ater à funcionalidade padrão do Python.
Resumo
Parabéns! Você concluiu o laboratório de Gerenciamento de Arquivos. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.