| | | | |

6.1 Arquivos

Compre o e-book deste material aqui!

6.1.1 Arquivo Texto

Um arquivo texto usualmente é identificado com a extensão .txt e contém uma string, i.e. uma coleção de caracteres.

Consideramos que o seguinte arquivo:

Código 7: foo.txt
1'''
2Tabela de valores de
3y = log(x).
4'''
5
6n, x, y
71, 1.0, 0.0000
82, 1.5, 0.4055
93, 2.0, 0.6931
104, 2.5, 0.9163

O nome deste aquivo é foo.txt. Escreva-o em um editor de texto e salve-o com o nome foo.txt em uma pasta de sua área de usuário no sistema de seu computador.

Leitura

Em programação, a leitura de um arquivo consiste em importar dados/informação de um arquivo para um código/programa. Para tanto, precisamos abrir o arquivo, i.e. criar um objeto file associado ao arquivo. Em Python, abrimos um arquivo com a função open(file, mode). Nela, file consiste em uma string com o caminho para o aquivo no sistema de arquivo do sistema operacional e, mode é uma string que especifica o modo de abertura. Para a abertura em modo leitura de um arquivo texto, usa-se mode=’r’ (r, do inglês, read).

Um vez aberto a leitura do arquivo pode ser feita com métodos específicos do objeto file, por exemplo, com o método file.red. Para uma lista de métodos disponíveis em Python, consulte

https://docs.python.org/3/tutorial/inputoutput.html#methods-of-file-objects

Por fim, precisamos fechar o arquivo, o que pode ser feito com o método file.close.

Por exemplo, consideramos o seguinte código

1fl = open('foo.txt', 'r')
2texto = fl.read()
3fl.close()
4print(texto)

Na primeira linha, o código: 1. abre o arquivo foo.txt4040endnote: 40Aqui, é considerado que o arquivo está na mesma pasta em que o código está sendo executado., 2. lê o aquivo inteiro, 3. fecha-o e, 4. imprime o conteúdo lido. No código, texto é uma string que pode ser manipulada com os métodos e técnicas na Seção 2.6.

Alternativamente, pode-se fazer a leitura linha-por-linha do arquivo, como segue

1fl = open('foo.txt', 'r')
2for linha in fl:
3  print(linha)
4fl.close()

Escrita

A escrita de um arquivo consiste em exportar dados/informações de um código/programa para um arquivo de dados. Para tanto: 1. abrimos o arquivo no código com o comando open(file, mode=’w’) (w, do inglês, write); 2. usamos um método de escrita, por exemplo, file.write para escrever no arquivo; 3. fechamos o arquivo com file.close.

Por exemplo, o seguinte código escreve o arquivo foo.txt (consulte o Código 7).

Código 8: foo.py
1import numpy as np
2# abre o arq
3fl = open('foo.txt', mode='w')
4# cabeçalho
5fl.write("""'''
6Tabela de valores de
7y = log(x)
8'''\n""")
9# linha em branco
10fl.write('\n')
11# id das entradas
12fl.write('n, x, y\n')
13# entradas da tabela
14xx = np.arange(1., 3., 0.5)
15for i,x in enumerate(xx):
16  fl.write(f'{i+1}, {x:.1f}, {np.log(x):.4f}\n')
17# fecha o arq
18fl.close()

Observamos que abertura de arquivo no modo mode=’w’ sobrescreve o arquivo caso ele já exista. Para escrever em um arquivo já existente, sem perdê-lo, podemos usar o modo mode=’a’ (’a’, do inglês, append).

Exemplo 6.1.1.

Vamos fazer um código que adiciona uma nova entrada na tabela de valores do arquivo foot.txt, disponível no Código 7. A nova entrada, corresponde ao valor de y=ln(3.0).

1import numpy as np
2# abre o arq
3fl = open('foo.txt', mode='a')
4x = 3.
5y = np.log(x)
6fl.write(f'5, {x:.1f}, {y:.4f}\n')
7# fecha o arq
8fl.close()

6.1.2 Arquivo Binário

Um arquivo binário permite a escrita e leitura de dados binários de qualquer tipo (int, float, str, tuple, list, etc.). A módulo pickle contém funções para a escrita e leitura de dados em aquivos binários.

Escrita

Em um arquivo binário, os dados são escritos como registros binários, i.e. precisam ser convertidos para binário (serializados) e escritos no arquivo. A função pickle.dump faz isso para qualquer objeto Python.

Exemplo 6.1.2.

Vamos escrever uma versão binária foo.pk do arquivo texto foo.txt trabalho acima. Para tanto, precisamos organizar os dados em um único objeto Python. Aqui, usamos um dict para organizar a informação e, então, salvar em arquivo binário.

Código 9: foo.bin
1import numpy as np
2import pickle
3# dados
4data = {}
5## cabeçalho
6data['info'] = 'Tabela de valores de y = log(x)'
7## entradas
8data['x'] = np.arange(1., 3., 0.5)
9data['y'] = np.log(data['x'])
10# abre arquivo
11fl = open('foo.bin', 'wb')
12# escreve no arquivo
13pickle.dump(data, fl)
14# fecha arquivo
15fl.close()

Leitura

A leitura de um arquivo binário requer conhecer a estrutura dos dados alocados. No caso de um arquivo pickle, a leitura pode ser feita com a função pickle.load. Por exemplo, o arquivo foo.bin (criado no Código 9) pode ser lido como segue

1fl = open('foo.bin', 'rb')
2data = pickle.load(fl)
3fl.close()
4print(data)
Observação 6.1.1.

(Atenção.) Não abra e leia arquivos pickle que você não tenha certeza do conteúdo. Aquivos deste formato podem conter qualquer objeto Python, inclusive funções maliciosas.

6.1.3 Escrita e Leitura com NumPy

O NumPy contém a função numpy.save(fn, arr) para escrita no arquivo binário fn um arranjo numpy.array. Por padrão, a extensão .npy é usada. Por exemplo,

1import numpy as np
2xx = np.arange(1., 3., 0.5)
3yy = np.log(xx)
4data = np.vstack((xx, yy))
5np.save('foo.npy', data)

A leitura de um arquivo .npy pode ser feita com a função numpy.load(fn), que retorna o arranjo lido a partir do arquivo binário fn. Por exemplo,

1import numpy as np
2data = np.load('foo.npy')
3print(data)

6.1.4 Exercícios

E. 6.1.1.

Baixe o arquivo foo.txt disponível no Código 7. Então, desenvolva um código que:

  1. a)

    leia o aquivo foo.txt e,

  2. b)

    salve um novo arquivo novo.txt que não contenha a terceira entrada da tabela contida no arquivo original.

Resposta.
1fin = open('foo.txt')
2fout = open('novo.txt', 'w')
3for i, linha in enumerate(fin):
4  if (i != 8):
5    fout.write(linha)
6fin.close()
7fout.close()
E. 6.1.2.

Desenvolva um código que escreve a seguinte tabela de ângulos fundamentais em um arquivo texto.

θ sin(θ) cos(θ)
0 0 1
π/6 3/2 1/2
π/4 2/2 2/2
π/3 1/2 3/2
π/2 1 0
Resposta.

Dica: consulte o Código 8.

E. 6.1.3.

Desenvolva um código que escreve a tabela dada no Exercício 6.1.2 como um dicionário em um arquivo binário. Então, leia o arquivo gerado e verifique os dados salvos.

Resposta.

Dica: consulte a Subseção 6.1.2.

E. 6.1.4.

Baixe para seu computador o seguinte arquivo texto.

Código 10: mat.txt
1'''
2Matriz A
3'''
41, -1, 2
52, 1, 3,
6-3, -1, -2

Este arquivo contém os elementos da matriz A=[ai,j]i,j=13,3. Desenvolva um código que leia este arquivo, aloque a matriz A associada e, então, calcule e imprima o valor de seu determinante, i.e. det(A).

Resposta.

Dica: use o método str.split.

E. 6.1.5.

Faça um código que salve a matriz

A=[112213312] (6.1)

como um arquivo binário .npy. Em um outro código, leia o arquivo gerado, compute e imprima o traço de A, i.e.

tr(A)=i=13ai,i. (6.2)
Resposta.

Dica: tr(A)=0.


Envie seu comentário

As informações preenchidas são enviadas por e-mail para o desenvolvedor do site e tratadas de forma privada. Consulte a Política de Uso de Dados para mais informações. Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!