• Nenhum resultado encontrado

Computadores e Programação Engª Biomédica Departamento de Física Faculdade de Ciências e Tecnologia da Universidade de Coimbra Ano Lectivo 2005/2006

N/A
N/A
Protected

Academic year: 2021

Share "Computadores e Programação Engª Biomédica Departamento de Física Faculdade de Ciências e Tecnologia da Universidade de Coimbra Ano Lectivo 2005/2006"

Copied!
10
0
0

Texto

(1)

Computadores e Programação – Engª Biomédica 2005/06 – Ficha 10 Página 1 de 10

Computadores e Programação

Engª Biomédica

Departamento de Física

Faculdade de Ciências e Tecnologia da Universidade de Coimbra

Ano Lectivo 2005/2006

F

F

I

I

C

C

H

H

A

A

1

1

0

0

F

ICHEIROS

10. Objectivos

Conhecimentos que o aluno deverá obter após a realização da ficha: - Manipulação de ficheiros;

- Criação de um objecto ficheiro através de open();

- Utilização dos métodos close(), read(), readline(), readlines(), write(), tell() e

seek().

10.1. Ficheiros

Subjacente ao desenvolvimento de qualquer programa, está a manipulação de estruturas de dados. Por muito simples que seja, uma aplicação pretende sempre analisar um conjunto de dados e produzir um resultado em função daqueles. Ao longo do semestre, o aluno implementou vários programas, sem no entanto salvaguardar os resultados que foi produzindo. Imagine agora que passava a ser importante conhecer dados de utilizações anteriores de um determinado programa. Dito de outra forma, suponha que se tornava necessário salvaguardar determinados contextos. Por exemplo, recorde o exercício da conta bancária (ficha 9) e suponha que tinha sido desenvolvido para uma aplicação real. Seria com certeza inadmissível que, por falha da corrente eléctrica, o banco perdesse a informação do saldo dos seus clientes. Portanto, tornar-se-ia necessário armazenar os dados do cliente, sempre que se efectuasse um levantamento ou depósito na sua conta. Como fazê-lo? Uma solução possível, seria procedendo ao seu armazenamento em ficheiro. Esta necessidade não se verifica apenas neste

(2)

Computadores e Programação – Engª Biomédica 2005/06 – Ficha 10 Página 2 de 10

exemplo. De facto, a gestão de ficheiros é uma das tarefas mais comuns em qualquer linguagem de programação. E naturalmente, Python também suporta instruções de abertura de ficheiro para leitura ou escrita de dados, deslocação da posição dentro de ficheiro, e o fecho do ficheiro.

Este tipo de instruções, bem como outras relacionadas com elas, serão objecto de estudo nesta ficha.

10.2. open()

Antes de manipular qualquer ficheiro, é necessário abri-lo. A primeira operação de manipulação de um ficheiro, abre-o. A instrução capaz de o fazer, designa-se por open(). Quando é executada retorna um objecto ficheiro de Python. Um ficheiro pode ser aberto por dois motivos: para leitura e/ou para escrita de dados. No processo de abertura, há uma forma de definir o modo em que o ficheiro é aberto. Consiste numa sequência de caracteres, que pode ter um dos seguintes valores:

v ‘r’ (read) – abre ficheiro apenas para leitura;

v ‘w’ (write) – abre ficheiro apenas para escrita;

v ‘a’ (append) – abre ficheiro para escrita, adicionando os dados ao fim do

ficheiro;

v ‘r+’ – abre ficheiro para leitura e também para escrita.

Os sistemas operativos Windows e Macintosh permitem igualmente a abertura de ficheiros nos modos rb, wb, ab e r+b, idênticos aos anteriores, mas usados apenas em ficheiros binários. Um ficheiro binário contém mais do que texto, e um bom exemplo é um ficheiro de som comprimido, o popular mp3, ou então um ficheiro jpeg de imagem.

Crie agora na pasta C:\Python23\ o ficheiro nome.txt que deve conter o seguinte texto:

Carolina Teles Ribeiro

Avenida da Boavista, 658 - 1º Dto 4100 - Porto

(3)

Computadores e Programação – Engª Biomédica 2005/06 – Ficha 10 Página 3 de 10

De seguida, usa-se a instrução open() para abrir o ficheiro em modo de leitura ‘r’. A esta instrução devem ser passados dois parâmetros: o nome do ficheiro com o

path (ou caminho) especificado, se necessário; e o modo de abertura:

>>> np=open('nome.txt', 'r') >>> print np

<open file 'nome.txt', mode 'r' at 0x00A596E0> >>>

Caso o modo de abertura não seja usado, o ficheiro é por defeito aberto em modo de leitura. Tentar abrir para leitura um ficheiro inexistente, retorna uma mensagem de erro:

>>> np=open('nomezzzz.txt', 'r')

Traceback (most recent call last):

File "<pyshell#3>", line 1, in -toplevel- np=open('nomezzzz.txt', 'r')

IOError: [Errno 2] No such file or directory: 'nomezzzz.txt' >>>

Por outro lado, abrir um ficheiro inexistente para escrita (em modo ‘w’ ou ‘a’), automaticamente cria esse ficheiro:

>>> np=open('nomezzzz.txt', 'w') >>>

Neste caso, o ficheiro nomezzzz.txt é criado, ficando de imediato disponível para ser utilizado, ou seja, para que nele sejam escritos dados.

Os restantes tópicos desta ficha, assumem que um objecto do tipo ficheiro chamado np, foi criado.

(4)

Computadores e Programação – Engª Biomédica 2005/06 – Ficha 10 Página 4 de 10

10.3. close()

O método close() faz a operação oposta a open(), ou seja, fecha o ficheiro:

>>> np.close() >>> print np

<closed file 'nome.txt', mode 'r' at 0x00A596E0> >>>

10.4. read()

A operação read(), um método do objecto np, permite ler um determinado número de bytes a partir de ficheiro. De novo, usando o ficheiro de texto nome.txt, veja-se o exemplo:

>>> np=open('nome.txt', 'r') >>> np.read(7)

'Carolin' >>>

Lêem-se os primeiros 7 bytes do ficheiro. Se read() for chamado sem parâmetro ou com um valor negativo, o ficheiro é lido na sua totalidade. É da responsabilidade do programador saber se a computador possui memória suficiente para ler todo o ficheiro.

>>> np.read()

'a Teles Ribeiro\nAvenida da Boavista, 658 - 1D\n4100 -

Porto\nPortugal\n' >>> np.read() ''

>>>

Note os caracteres \n que indicam mudança de linha. Uma vez atingido o fim do ficheiro, uma nova chamada a read() retorna uma string vazia ‘’.

(5)

Computadores e Programação – Engª Biomédica 2005/06 – Ficha 10 Página 5 de 10

10.5. readline()

O método readline() lê apenas uma linha do ficheiro, deixando um caracter \n no final da string (\n é apenas omitido na última linha, se o ficheiro não terminar com uma nova linha):

>>> np=open('nome.txt', 'r') >>> np.readline()

'Carolina Teles Ribeiro\n' >>> np.readline() 'Avenida da Boavista, 658 - 1D\n' >>> np.readline() '4100 - Porto\n' >>> np.readline() 'Portugal\n' >>> np.readline() '' >>>

Se retornar uma string vazia (‘’), significa que chegou ao fim do ficheiro.

10.6. readlines()

readlines() retorna uma lista contendo todas as linhas do ficheiro. Em cada

elemento da lista fica uma frase do ficheiro (string). Se o final do ficheiro tiver sido atingido, a invocação do método retorna uma lista vazia ([]).

>>> np=open('nome.txt', 'r') >>> np.readlines()

['Carolina Teles Ribeiro\n', 'Avenida da Boavista, 658 - 1D\n', '4100 - Porto\n', 'Portugal\n']

>>> np.readlines() []

(6)

Computadores e Programação – Engª Biomédica 2005/06 – Ficha 10 Página 6 de 10

10.7. write()

O método write() permite a escrita de um determinado número de bytes em ficheiro. Suponha que pretende acrescentar a string “Telefone: 22 123 45 67\n” ao ficheiro nome.txt, numa nova linha, imediatamente a seguir à última string “Portugal\n”. Uma forma de o fazer seria:

>>> np=open('nome.txt','a')

>>> np.write('Telefone: 22 123 45 67\n') >>> np.close()

>>> np=open('nome.txt','r') >>> np.read()

'Carolina Teles Ribeiro\nAvenida da Boavista, 658 - 1D\n4100 -

Porto\nPortugal\nTelefone: 22 123 45 67\n' >>>

É, no entanto, necessário algum cuidado na utilização do modo de escrita. Se, em alternativa ao acrescento descrito acima e implementado com o modo ‘a’ (append), se usasse o modo ‘w’ de escrita no ficheiro:

>>> np=open('nome.txt','w') >>> np.write('Telefone: 22 123 45 67\n') >>> np.close() >>> np=open('nome.txt','r') >>> np.read() 'Telefone: 22 123 45 67\n' >>>

Toda a informação nele contida anteriormente seria perdida! De facto, este modo é destrutivo, pois efectua a escrita com sobreposição dos dados anteriores!

10.8. tell()

Quando executado, o método tell() devolve um inteiro que contém a posição actual no ficheiro relativamente ao seu início.

(7)

Computadores e Programação – Engª Biomédica 2005/06 – Ficha 10 Página 7 de 10

10.9. seek()

Já o método seek() altera a posição actual no ficheiro. Recebe dois parâmetros, onde o primeiro deverá indicar o deslocamento, e o segundo o local a partir do qual esse deslocamento se efectua. Este último parâmetro pode tomar um de três possíveis valores: 0 no caso do referencial ser o início do ficheiro; 1 caso conte a partir da posição actual; e 2 para contar a partir do fim do ficheiro. Quando omitido, este parâmetro assume o valor 0. Repare-se novamente no exemplo aplicado ao ficheiro nome.txt original:

>>> np=open('nome.txt','r')

>>> np.seek(3,0) # Vai para 3º byte a contar do início

>>> np.tell() 3L

>>> np.read(1) 'o'

>>> np.seek(5,1) # Avança 5 bytes a partir da posição actual

>>> np.tell() 9L

>>> np.read(1) 'T'

>>> np.seek(-10,2) # Vai para 10º byte a contar do fim (conta \n\n)

>>> np.tell() 69L >>> np.read(1) 'P' >>> np.close() >>>

Exemplo de acesso a ficheiro para leitura

Suponha que possui um determinado ficheiro de texto chamado bd.txt, com dados relativos aos funcionários de uma empresa. A informação relativa a cada pessoa ocupa três linhas: a primeira linha indica o nome; a segunda o número do bilhete de identidade; e a terceira a data de nascimento, como demonstra o exemplo:

(8)

Computadores e Programação – Engª Biomédica 2005/06 – Ficha 10 Página 8 de 10

Ana Pinto Dias 8436622

5 de Janeiro de 1957

Carlos Garcia Tavares Meireles 9877432

12 de Dezembro de 1964 ...

...

O seguinte programa implementa uma pesquisa do nome de um funcionário no ficheiro, e no caso de o encontrar, retorna a informação relativa a esse funcionário.

# Gabriel Falcao Fernandes # FCTUC

# 27.11.2003

# Este programa pesquisa um nome num ficheiro de texto ‘bd.txt’ e devolve # a linha de texto correspondente ao nome, bem como as 2 linhas seguintes

from string import * # vai usar funcao find() do modulo string

nome = raw_input('Insira o nome do funcionario a procurar:\n') print '\n' f = open('bd.txt', 'r') print '#=#=#=#=#=#==#=#=#=#=#=#=#=#=#=#=#=#' ENCONTROU = 0 linha = 'inicio' while linha!='':

linha = f.readline() # Procura ocorrencia de nome na nova linha e if (find(linha, nome) != -1): # se for verdade encontrou alguem! print linha, # Imprime nome

linha = f.readline()

print linha, # Imprime numero de BI linha = f.readline()

(9)

Computadores e Programação – Engª Biomédica 2005/06 – Ficha 10 Página 9 de 10 ENCONTROU = 1

break

if ENCONTROU == 0:

print 'O(A) funcionario(a) nao consta da base de dados...' print '#=#=#=#=#=#==#=#=#=#=#=#=#=#=#=#=#=#'

f.close()

No caso de haver mais do que uma pessoa com o mesmo nome, este programa devolve apenas a primeira que encontrar. Numa situação real, deveria mostrar todas as pessoas cujo nome é procurado. Para que tal suceda, que alteração1 ao

programa sugere?

10.10.

Exercícios sugeridos

1. Desenvolva um programa que crie em C:\Python23 um ficheiro

readme.txt com a indicação do seu nome, número de aluno e turma.

2. Escreva um programa que peça ao utilizador dez nomes, dez números de BI e dez datas de nascimento, e os insira sucessivamente num ficheiro de texto. Os dados associados a cada pessoa deverão ocupar três linhas do ficheiro de texto (à semelhança do exemplo descrito na ficha).

3. Crie uma aplicação que, pesquisando um ficheiro de texto (por exemplo o ficheiro do exercício anterior), retorne o número de ocorrências de uma palavra nesse mesmo ficheiro. Quer a palavra a pesquisar, quer o nome do ficheiro devem ser introduzidos pelo utilizador.

1

(10)

Computadores e Programação – Engª Biomédica 2005/06 – Ficha 10 Página 10 de 10

4. Desenvolva um programa que copie as linhas pares de um ficheiro de texto e as guarde noutro ficheiro.

5. Deve agora implementar uma função que recebendo uma lista de strings, devolva o tamanho médio dessas strings. Para tal, deverá utilizar a função

reduce(). Implemente um programa que abra um ficheiro de texto e teste a

função.

6. Implemente a classe ManipFicheiro e os respectivos métodos, que deverão efectuar as seguintes manipulações em ficheiros de texto:

v O construtor recebe o nome do ficheiro a manipular

v O método ContaLinhas conta o número de linhas do ficheiro v ContaEspacos conta o número de espaços ‘ ’ no ficheiro v Tamanho retorna o tamanho do ficheiro em bytes

v EncontraString recebe uma string e devolve as linhas que contêm essa

sequência de caracteres

Referências

Documentos relacionados

Neste capítulo foram descritas: a composição e a abrangência da Rede Estadual de Ensino do Estado do Rio de Janeiro; o Programa Estadual de Educação e em especial as

Além desta verificação, via SIAPE, o servidor assina Termo de Responsabilidade e Compromisso (anexo do formulário de requerimento) constando que não é custeado

de professores, contudo, os resultados encontrados dão conta de que este aspecto constitui-se em preocupação para gestores de escola e da sede da SEduc/AM, em

De acordo com o Consed (2011), o cursista deve ter em mente os pressupostos básicos que sustentam a formulação do Progestão, tanto do ponto de vista do gerenciamento

Quando conheci o museu, em 2003, momento em foi reaberto, ele já se encontrava em condições precárias quanto à conservação de documentos, administração e organização do acervo,

The challenges of aging societies and the need to create strong and effective bonds of solidarity between generations lead us to develop an intergenerational

In this work, improved curves are the head versus flow curves predicted based on the correlations presented in Table 2 and improved by a shut-off head prediction