• Nenhum resultado encontrado

Manipulação de arquivos e definição de funções em Python

N/A
N/A
Protected

Academic year: 2021

Share "Manipulação de arquivos e definição de funções em Python"

Copied!
4
0
0

Texto

(1)

Universidade Federal de Pernambuco – UFPE Centro de Informática

Sistemas de Informação IF968 – Programação 1 Professor: Renato Vimieiro

Lista de exercícios práticos 4 – Manipulação de arquivos e funções

Entrega: 18/05/16

Instruções

• Faça os algoritmos em python.

• Faça um algoritmo por arquivo.

• Utilize o template disponível no site da disciplina

Manipulação de arquivos e definição de funções em Python

Procedimentos e funções

Funções são definidas em Python através da palavra reservada def. A definição segue a mesma lógica vista em pseudocódigo, isto é, utiliza-se a palavra reservada para indicar que se está declarando uma função, em seguida define-se seu identificador, seguido da lista de parâmetros. A sintaxe é a seguinte:

def <identificador> (<parâmetros>):

<lista de cmds>

return <valor>

Note que em Python não há distinção entre procedimentos e funções. Sendo assim, a instrução return pode ou não ser utilizada, dependendo se o sub-programa retorna ou não algum valor.

A seguir é dado um exemplo de um procedimento e função:

def exibe_vetor (vetor):

for i in xrange(len(vetor)):

print vetor[i]

def abs (n):

if n < 0: return -1 * n return n

Essas funções são chamados no programa principal da mesma forma que em pseudocódigo. Um exemplo é o programa principal a seguir:

import numpy as np

# aqui vem a definicao das funcoes x = np.ones(5,"int")

exibe_vetor(x) print abs(-5)

Há uma importante diferença entre pseudocódigo e Python em relação aos parâmetros de uma função. Em Python, além da notação posicional em que a ordem dos argumentos corresponde aos parâmetros formais da função, é possível também passar argumentos por nomeação. No caso de passagem de parâmetro por nomeação, é possível desvincular-se da ordem original dos parâmetros desde que se identifique a quem deve ser atribuído um certo valor.

Considere o seguinte exemplo:

def soma_naturais (n,m):

soma = 0

for i in xrange(n,m):

soma += i return soma

A chamada dessa função no programa principal pode ser feita passando-se em ordem os valores de n e m, ou dizendo-se qual valor será atribuído a cada parâmetro:

print soma_naturais(10,50) print soma_naturais(m=50,n=10)

1

(2)

Arquivos

Como visto anteriormente, todos os dados são armazenados em formato binário em um computador, mesmo os aqueles textuais. Entretanto, ao se trabalhar com arquivos, faz-se distinção entre dois tipos: arquivos binários e arquivos texto. Em arquivos texto, a informação é armazenada, como o próprio nome diz, em formato textual. Em outras palavras, o arquivo contém um conjunto de strings representando os dados armazenados, logo números são convertidos para caracteres/strings antes de serem gravados. Já em arquivos binários, os dados são armazenados diretamente utilizando-se a mesma representação usada em memória principal. Logo, inteiros são armazenados como inteiros (conjunto de 32/64 bits, por exemplo), floats são armazenados como floats, e assim por diante.

O ciclo básico de trabalho com qualquer tipo de arquivo é basicamente o mesmo: abertura, escrita/leitura, e fechamento.

Abertura

A sintaxe para abertura de um arquivo em Python é a seguinte:

<identificador> = open(<caminho>,<modo_de_abertura>)

O identificador será usado para acessar os dados do arquivo similar ao que é feito com outras variáveis. O caminho, que deve ser uma expressão do tipo string, especifica o local em que o arquivo se encontra no disco. O modo de abertura especifica qual o uso (leitura/escrita) e formato (binário/texto) do arquivo. Os modos listados na tabela abaixo estão disponíveis em Python (texto traduzido de http://www.tutorialspoint.com/python/python_files_io.htm):

Modo Descrição

r Abre arquivo texto somente para leitura.

rb Abre arquivo binário somente para leitura.

r+ Abre arquivo texto para leitura e escrita. O arquivo deve existir no sistema.

rb+ Abre arquivo binário para leitura e escrita.

w Abre arquivo texto somente para escrita. Se o arquivo não existir, ele será criado, caso contrário ele será sobrescrito.

wb Abre arquivo binário somente para escrita. Se o arquivo não exis- tir, ele será criado, caso contrário ele será sobrescrito.

w+ Abre arquivo texto para leitura e escrita. Se o arquivo não existir, ele será criado, caso contrário ele será sobrescrito.

wb+ Abre arquivo binário para leitura e escrita. Se o arquivo não existir, ele será criado, caso contrário ele será sobrescrito.

a Abre arquivo para anexar conteúdo. Se o arquivo existir, ele será aberto no final para acrescentar dados; caso contrário será criado.

ab Abre arquivo binário para anexar conteúdo. Se o arquivo existir, ele será aberto no final para acrescentar dados; caso contrário será criado.

a+ Abre arquivo texto para leitura e escrita. Se o arquivo existir, ele será aberto no final para acrescentar dados; caso contrário será criado. O conteúdo não é sobrescrito

ab+ Abre arquivo binário para leitura e escrita. Se o arquivo existir, ele será aberto no final para acrescentar dados; caso contrário será criado. O conteúdo não é sobrescrito

Recomenda-se a leitura do endereço apontado acima para conhecer as demais funcionalidades disponíveis.

Fechamento

Tendo terminado de usar o arquivo, o usuário deve fechá-lo. Isso informa ao sistema operacional que o programa não mais usará o arquivo e, assim, qualquer dado que ainda não tenha sido fisicamente escrito no arquivo

1

será armazenado em disco.

A sintaxe para fechamento de um arquivo é a seguinte:

<identificador>.close()

Veja um exemplo em que um arquivo em branco é criado (abertura para gravação) e fechado imediatamente.

f = open("teste_arquivo_python.txt","w") f.close()

1O sistema pode aguardar até que um númeroxde bytes seja escrito antes que eles sejam de fato armazenados no disco. Essa técnica, chamada de buferização, permite um melhor desempenho computacional visto que acessos ao disco são extremamente lentos. Dessa forma, com o uso de buffers (repositórios onde os dados são armazenados temporariamente), substitui-se o acesso para cada dado a ser gravado, por um acesso único para gravação de todos os dados no buffer.

2

(3)

Leitura e escrita

A leitura de arquivos texto é feita utilizando-se os comandos a seguir:

read(tamanho) Lê tamanho caracteres/bytes do arquivo. Se tamanho não for informado ou for negativo, então efetua a leitura do arquivo inteiro (o usuário é responsável caso o arquivo seja maior que a memória disponível!).

readline Lê uma única linha do arquivo. Retorna todos os caracteres da linha até (inclusive) o ‘\n’.

Para exemplificar a leitura de arquivos texto, considere um arquivo com o seguinte conteúdo:

Cinco primeiros sao c,i,n,c e o.

Esta e a segunda linha do arquivo.

Terceira linha.

Logo, para ler os 5 primeiros símbolos e, em seguida, ler o restante da linha e a segunda linha inteira, pode-se utilizar os comandos:

f = open("arquivo_exemplo.txt","r") f.read(5)

f.readline() f.readline() f.close()

A escrita de arquivos texto é feita com o comando write() (similar ao comando sys.stdout.write visto em outra prática de laboratório). Como arquivos texto só aceitam strings, qualquer outro tipo de dado deve ser convertido para string antes de poder ser escrito no arquivo. Conversões podem ser feitas usando-se a função str().

É importante lembrar que o comando write, ao contrário do print, não adiciona o ‘\n’ ao final do conteúdo.

Assim, você deve se lembrar de escrever essa string caso queira quebrar a linha em algum ponto. Segue um exemplo de escrita:

f = open("arquivo_exemplo_2.txt","w") f.write("Gravando um texto...")

f.write("para quebrar a linha, deve-se gravar o \n") f.write("Um valor numerico pode ser gravado assim: ") f.write(str(5**5))

f.close()

Novamente, é muito importante fechar o arquivo ao final para garantir que os dados sejam efetivamente transferidos para o arquivo.

A leitura e escrita de arquivos binários deve ser feita utilizando-se apenas os comandos read e write como mostrado para arquivos texto. No entanto, a manipulação de arquivos binários em Python possui uma pequena diferença com respeito a arquivos texto: existe a necessidade de se codificar e decodificar os dados para binário durante, respectivamente, a escrita e a leitura. Tal codificação e decodificação é feita através das funções pack e unpack do módulo struct. Para que essas funções possam ser usadas, deve-se acrescentar, no cabeçalho do código, a seguinte linha:

from struct import pack,unpack

Uma vez importadas, a sintaxe das funções é a seguinte:

pack(<tipo>,<expressao>) para codificar os dados em binário (escrita) unpack(<tipo>,<expressao>) para decodificar os dados em binário (leitura)

A expressão é o valor a ser convertido para binário enquanto o primeiro argumento é um código representando o tipo do dado. A tabela abaixo apresenta a relação dos tipos e seus códigos:

3

(4)

Código Tipo Tipo em NumPy Tamanho

‘c’ caracter string 1

‘b’ inteiro de 8 bits int8 1

‘B’ inteiro de 8 bits sem sinal uint8 1

‘ ?’ lógico bool 1

‘h’ inteiro de 16 bits int16 2

‘H’ inteiro de 16 bits sem sinal uint16 2

‘i’ inteiro 32 bits int 4

‘I’ inteiro sem sinal uint32 4

‘q’ inteiro 64 bits int64 8

‘Q’ inteiro de 64 bits sem sinal uint64 8

‘f’ float 32 bits float32 4

‘d’ float de 64 bits float 8

‘s’ string object –

É importante observar os tamanhos de cada tipo principalmente ao decodificar os dados (feita ao lê-los do arquivo).

Nesse caso, a quantidade de bytes lidos por read deve corresponder ao tamanho do tipo que se deseja converter. Por exemplo, para ler um inteiro de 64 bits de um arquivo binário, deve-se utilizar a seguinte sintaxe:

from struct import pack,unpack f = open("arquivo_binario.bin","rb") idade = unpack(’q’,f.read(8))

f.close() Exercícios

1. Faça um programa que tenha uma função para ler 10 inteiros e armazena-los em um vetor, outra para computar a média desses elementos e uma terceira para exibir os valores. O programa principal deve conter as funções e executá-las em ordem, ao final deve-se ainda exibir a média.

2. Faça um programa que leia um arquivo contendo a lista dos alunos de uma disciplina e suas respectivas notas em 4 avaliações, calcule a média da turma em cada avaliação e depois exiba os nomes dos alunos acima da média. Os diversos campos (nome e notas) estarão separados por vírgulas. Use o arquivo colocado no site da disciplina para testar seu programa.

Dica: use a função strip() para remover o símbolo de quebra de linha de uma string e a função split() para quebrá-la de acordo com um separador. Detalhes sobre essas funções estão na documentação de Python.

3. Faça um programa para encriptar e decifrar um arquivo conforme as especificações a seguir (exercício tirado da lista do Prof. Flávio Keidi Miyazawa do IC - Unicamp).

O método de criptografia do imperador romando Júlio César considerava a ordem dos caracteres no alfabeto e trocava cada letra pela k-ésima letra seguinte. Por exemplo, se k = 3, então todas as ocorrências da letra ‘A’

eram trocadas por ’D’; todos os ‘B’s eram trocados por ‘E’s, assim por diante. Esta substituição era feita de maneira cíclica, neste caso a letra ’Z’ era trocada pela letra ’C’. A mensagem é decifrada usando a operação inversa.

O valor k deve ser lido do teclado, assim como o nome do arquivo.

Para resolver esse problema, você precisará das funções auxiliares chr() e ord().

4. Implemente os exercícios da lista 2 em Python.

4

Referências

Documentos relacionados

4.1 nos termos do inciso XVI do Artigo 20 do Estatuto Social da Companhia, a proposta a ser submetida à apreciação da Assembleia Geral, de ratificação da nomeação e da contratação

3.2.1 A Secção 2.3 acima reconheceu o interesse das autarquias na existência de um enquadramento claro de disciplina orçamental mas apontou, igualmente, os defeitos sérios que

Depois disso inicia-se o processo de cálculos e seleção dos elementos de projeto tais como área superficial da estrutura, composição do meio filtrante, vegetação, zona

O método stepwise diz respeito à forma como as possíveis variáveis explicativas são testadas na modelagem pesquisada pela análise de regressão linear, isto é, ele

No sentido de reverter tal situação, a realização deste trabalho elaborado na disciplina de Prática enquanto Componente Curricular V (PeCC V), buscou proporcionar as

[...] e comum encontrarmos professores conduzindo o trabalho de leitura de acordo com um ritual ja determinado, que inclui leituras silenciosa e oral, seguidas de uma discussao

Em suma, seja pela assimetria constitutiva do regime monetário interna- cional, pela tendência ao acima aludido distúrbio no balanço de pagamentos ou ainda pelo tempo necessário

Entre os animais de congelabilidade não aceitável selecionou-se 6 garanhões, para os quais os tratamentos amidas foram superiores ao glicerol em todos os parâmetros