Dados de arquivos
Lendo dados de arquivos
Dados científicos comumente estão disponíveis em arquivos. Nós queremos ler os dados para objetos em um programa para poder computar esses dados.
Exemplo de um arquivo de dados:
21.8 18.1 19 23 26 17.8
Um número em cada linha. Como podemos ler esses números?
Lendo arquivos linha por linha
Leitura de arquivos básica:
do_arquivo = open('dados.txt', 'r') ## abrindo arquivo
for linha in do_arquivo:
## faça alguma coisa com a linha
do_arquivo.close() ## fechando o arquivo
Calculando a soma dos números no arquivo:
do_arquivo = open('dados.txt', 'r') ## abrindo arquivo
acumulado = 0
for linha in do_arquivo:
numero = float(linha) ## a linha é uma cadeia de caracteres
acumulado += numero
print acumulado
do_arquivo.close()
Formas alternativas de ler um arquivo
Lendo todas as linhas de uma vez na forma de uma lista de cadeias de caracteres (as linhas):
linhas = do_arquivo.readlines()
for linha in linhas:
## processa a linha
do_arquivo.close()
A declaração moderna with
:
with open('dados.txt', 'r') as do_arquivo:
for linha in do_arquivo:
## processa a linha
A velha construção while
:
while True:
linha = do_arquivo.readline()
if not linha:
break
## processa a linha
do_arquivo.close()
Lendo o arquivo todo em uma cadeia de caracteres:
texto = do_arquivo.read()
## processa o texto da string
Mais exemplos:
>>> do_arquivo = open('tmp.txt', 'r')
>>> arquivo_str = do_arquivo.read()
>>> arquivo_str
'Linha 1.\nLinha 2.\nLinha 3.\nLinha 4.\n'
>>> arquivo_str.split() ## separa todas as palavras
['Linha', '1.', 'Linha', '2.', 'Linha', '3.', 'Linha', '4.']
>>> linha = 'Linha 3.\n'
>>> linha.split()
['Linha', '3.']
>>> linha.split('e')
['Lin', ' 3.\n']
Texto e números no arquivo
A maioria dos arquivos de dados contém texto e números no mesmo arquivo:
Arquivo com dados de chuvas:
Média de chuvas (em mm) em Roma: 1188 meses entre 1782 e 1970
Jan 81.2
Fev 63.2
Mar 70.3
Abr 55.7
Mai 53.0
Jun 36.4
Jul 17.5
Ago 27.5
Set 60.9
Out 117.7
Nov 111.0
Dez 97.9
Anual 792.9
Como ler tal arquivo?!
Salve como dados_chuva_roma.dat
Lendo um arquivo contendo texto e números
A ideia é ler cada linha separando a linha em palavras:
meses = []
valores = []
for linha in do_arquivo:
palavras = linha.split() ## separando em palavras
if palavras[0] != 'Anual':
meses.append(palavras[0])
valores.append(float(palavras[1]))
O que está faltando no arquivo acima?
Podemos separar em relação a qualquer cadeia de caractere s
: line.split(s)
>>> linha = 'Out 117.7'
>>> palavras = linha.split()
>>> palavras
['Out', '117.7,']
>>> type(palavras[1]) ## cadeia de caracteres, não um número
<type 'str'>
Programa completo para leitura dos dados de chuva
def extrair_dados(nome_arquivo):
arquivo = open(nome_arquivo, 'r')
arquivo.readline() ## pular a primeira linha
meses = []
chuva = []
for linha in arquivo:
palavras = linha.split()
## palavras[0]: mês, palavras[1]: chuva
meses.append(palavras[0])
chuva.append(float(palavras[1]))
arquivo.close()
meses = meses[:-1] ## removendo a entrada "Ano"
media_anual = chuva[-1] ## armazenando a média anual
chuva = chuva[:-1] ## Redefinindo para conter os dados mensais
return meses, chuva, media_anual
meses, valores, media = extrair_dados('dados_chuva_roma.dat')
print 'A média de chuvas para os meses:'
for mes, valor in zip(meses, valores):
print mes, valor
print 'A média de chuva para o ano:', media
Escrevendo dados para arquivos
Declarações básicas:
arquivo_saida = open(nome_arquivo, 'w') ## 'w' para escrever!
for dado in algumaLista:
arquivo_saida.write(algumTexto + dado + '\n')
arquivo_saida.close()
Se o arquivo já existir e você deseja acrescentar mais dados, pode ser feito com open(nomeArquivo, 'a')
Exemplo: escrevendo uma tabela em um arquivo
Temos a lista:
dados = [[ 0.75, 0.29619813, -0.29619813, -0.75 ],
[ 0.29619813, 0.11697778, -0.11697778, -0.29619813],
[-0.29619813, -0.11697778, 0.11697778, 0.29619813],
[-0.75, -0.29619813, 0.29619813, 0.75 ]]
Como escrever em um arquivo na forma tabular?
arquivo_saida = open('tmp_tabela.dat', 'w')
for linha in dados:
for coluna in linha:
arquivo_saida.write('%14.8f' % coluna)
arquivo_saida.write('\n')
arquivo_saida.close()
Resultado no arquivo:
0.75000000 0.29619813 -0.29619813 -0.75000000
0.29619813 0.11697778 -0.11697778 -0.29619813
-0.29619813 -0.11697778 0.11697778 0.29619813
-0.75000000 -0.29619813 0.29619813 0.75000000
O que é um arquivo?
- Um arquivo é uma sequência de caracteres;
- Para arquivos simples de texto, cada caractere é um byte (=8 bits, um bit é 0 ou 1), o que resultam em $ 2^8=256 $ caracteres diferentes;
- Arquivos de texto em, por exemplo, Chinês ou Japonês precisam de vários bytes para cada caractere;
- Salve o texto "ABCD" em um arquivo no Gedit/Emacs/Editor de Texto/Notepad++ e LibreOffice/Word e examine o arquivo!
- A leitura de arquivo em Python é o ato de ler todos os caracteres (
read
) ou ler linha por linha (readline
,readlines
,for linha in objArquivo
)