Ir para o conteúdo

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)