Buscar

Aula04---Manipulacao-de-Arquivos

Prévia do material em texto

Arquivos
O QUE É, COMO LER E MANIPULAR
Arquivos
 Variáveis oferecem armazenamento de dados temporariamente
 Os dados são perdidos quando o escopo da variável é finalizado ou quando 
o programa termina
 Arquivos são usados para retenção permanente de um grande 
conjunto de dados, mesmo depois que o programa que criou os 
dados termina
 Dados mantidos em arquivos são chamados de dados persistentes
 Computadores guardam arquivos em dispositivos de 
armazenamento secundário, tais como o HD, pen drive, DVD 
(alguém ainda usa?)
 Em Python, um arquivo pode ser lido/escrito por meio de um 
objeto da classe File
Arquivos default
 Sem saber, já utilizamos três arquivos default:
 Sempre que um comando print é executado, na verdade o 
resultado é direcionado para um arquivo chamado sys.stdout
 Sempre que lemos um dado através do comando input, na 
verdade estamos lendo de um arquivo chamado sys.stdin
 Mensagens de erro ou de rastreamento de exceções são 
enviadas para um arquivo chamado sys.stderr
Exemplo
>>> import sys
>>> sys.stdout.write(“Hello”)
Hello
>>> print “Hello”
Hello
>>> sys.stdin.readline()
UFRJ
‘UFRJ\n’  Na tela aparece ‘UFRJ’ e uma quebra de linha
>>> input()
‘UFRJ’
‘UFRJ’  o input ignora as quebras de linhas
>>> raw_input()
UFRJ
‘UFRJ’  é um input já preparado para String. Quebras de linha também são ignoradas
Abrindo arquivos
 Open (name, mode, buffering)
 name: nome do arquivo a abrir
 mode (opcional): modo de abertura
 r: Read. Leitura (Este é o modo default)
w: Write. Escrita
a: Append. Escrita a partir do final
 +: Utilizado junto com r. Indica leitura e escrita
 buffering (opcional): indica se a memória (buffer) é usada para 
acelerar as operações de entrada e saída
 0: buffers não são usados
 1 (ou qualquer número negativo): buffer de tamanho padrão (default)
 2 ou maior: tamanho do buffer em bytes
O objeto File
 O comando open retorna um objeto do tipo File (arquivo)
 O objeto retornado é usado subsequentemente para realizar 
operações de entrada e saída:
>>> arq = open (‘arquivo_teste.txt’, ‘w’)
>>> arq.write ("Oi")
>>> arq.close ()
>>> arq = open (‘arquivo_teste.txt’)
>>> x = arq.read()
>>> print x
Oi
Métodos Read, Write e Close
 read(num)
 Lê num bytes do arquivo e os retorna numa string
 Se num não é especificado, todos os bytes desde o ponto atual 
até o fim do arquivo são retornados
 Ou seja, se utilizado somente read() logo após abrir o arquivo, 
irá ler o arquivo inteiro do início ao fim
 write(string)
 Escreve string no arquivo
 Devido ao uso de buffers, a escrita pode não ser feita 
imediatamente
 Use o método flush() ou close() para assegurar a escrita física
Métodos Read, Write e Close
 close()
 Encerra o uso do arquivo para operações de leitura e escrita
 Se existir alguma escrita pendente no buffer, força a escrita 
imediata para após fechar o arquivo
Convenção de quebra de linha
 Arquivos de texto são divididos em linhas usando 
caracteres especiais
 Linux/Unix: \n
 Windows: \r\n
 Mac: \r
 Python usa sempre \n para separar linhas
 Ao se ler ou escrever um arquivo aberto em modo texto, o
interpretador Python traduz o ‘\n’ para se adequar ao sistema
operacional em que está sendo utilizado
Lendo e escrevendo linhas
 readline(n)
 Se n não é especificado, retorna exatamente uma linha lida do 
arquivo
 Caso contrário, lê no máximo n caracteres
 readlines()
 retorna uma lista de strings com o restante do conteúdo do 
arquivo. 
Atenção: Nenhum método de leitura retira quebra de linha
Lendo e escrevendo linhas
 Ao ler um arquivo que tenha quebra de linha os 
caracteres especiais podem vir junto
 Tais caracteres podem ser removidos com strip(), lstrip() 
ou rstrip()
 write(string)
 Escreve uma string no arquivo
 writelines(sequência)
 Escreve a lista (ou qualquer sequência) de strings, uma por uma 
no arquivo.
 Caracteres terminadores de linha não são acrescentados
Lendo um arquivo inteiro
def copiaArquivo (velhoArquivo, novoArquivo):
f1 = open(velhoArquivo, "r")
f2 = open(novoArquivo, "w")
while True:
texto = f1.readline() # lê a linha inteira
if texto == “”: # chegou no fim do arquivo
break
f2.write(texto)
f1.close()
f2.close()
return
Dicas
 Um for sobre um arquivo de leitura nos permite iterar 
sobre cada linha do arquivo por vez
for linha in arq:
print linha
 Podemos, de uma só vez, ler e numerar as linhas
for i, linha in enumerate(arq):
print i + 1, linha
Exercícios
 1) Escreva uma função que receba dois nomes de 
arquivos. O primeiro é o arquivo original que deve ser 
lido. O segundo deve ser gerado a partir do primeiro. 
Porém, o arquivo original contém algumas linhas que se 
iniciam com o caractere #. Essas linhas não devem estar 
presentes no arquivo que será gerado.
Exercícios
 2) Faça um programa que recebe o nome de um 
arquivo contendo uma lista de IP’s. O programa deve ler 
esse arquivo e gerar um outro arquivo chamado 
“relatório_ips.txt” indicando ao final de cada linha se o IP 
é válido ou inválido. O formato de um endereço IP válido 
é x.y.y.y, onde x vai de 1 a 255 e y vai de 0 a 255.
Pickling
 Arquivos são basicamente cadeias de caracteres, 
portanto para colocar valores numéricos em um arquivo, 
é necessário convertê-los para strings:
>>> arq = open(‘meu_arquivo.txt’, ‘w’)
>>> arq.write(10)  Erro!
>>> arq.write(str(12.3))  Ok!
>>> arq.write(str([4,5,6]))  Ok!
Pickling
 PROBLEMA!
 Quando você lê o valor a partir do arquivo, você tem uma 
string
 O tipo original da informação foi perdido
>>> arq = open(‘meu_arquivo.txt’, ‘r’)
>>> arq.readline()
'12.3[1, 2, 3]‘
 SOLUÇÃO: Pickling
Pickling
>>> import pickle
>>> f = open(‘teste.pck’,’w’)
 Para armazenar uma estrutura de dados, use o método 
dump e então feche o arquivo do modo usual:
>>> pickle.dump(40.2, f)
>>> pickle.dump([7,8,9], f)
>>> f.close()
 Um arquivo pickle não consegue ser lido por seres humanos
 Para recuperar o que escrevemos, utiliza-se o método load
Pickling
 Recuperando as estruturas:
>>> f = open('teste.pck', 'r')
>>> x = pickle.load(f) 
>>> print x
40.2  O método load lê uma linha, análogo ao readline()
>>> type(x)
<type 'float'>  Método type identifica o tipo do dado armazenado
>>> y = pickle.load(f)  Lendo a segunda linha
>>> print y
[7, 8, 9]
>>> type(y)
<type 'list‘>
Exercícios
 3) Você irá criar um programa que permite que o usuário
insira um número. Sempre que ele inserir coloque esse 
número numa lista e gere um número aleatoriamente e
coloque-o numa outra lista. Ao escolher encerrar o programa 
salve essas listas com o Pickle para poder continuar outro dia. 
As opções do usuário são:
1: Inserir um número de 1 a 50
2: Visualizar os números inseridos
3: Visualizar os números gerados
4: Visualizar a média total
5: Encerrar programa

Continue navegando