• Nenhum resultado encontrado

Arquivos de dados

No documento Python Para Desenvolvedores (páginas 58-66)

Na biblioteca padrão, o Python também fornece um módulo para simplificar o processamento de arquivos no formato CSV (Comma Separated Values).

O formato é muito simples, os dados são armazenados em forma de texto, separados por vírgula, um registro por linha.

Exemplo de escrita: import csv

# Dados

dt =(('temperatura', 15.0,'C', '10:40','2006-12-31'),

('peso', 42.5, 'kg', '10:45','2006-12-31')) # A escrita recebe um objeto do tipo "file"

out = csv.writer(file('dt.csv', 'w')) # Escrevendo as tuplas no arquivo

out.writerows(dt)

Arquivos e I/O 59

temperatura,15.0,C,10:40,2006-12-31 peso,42.5,kg,10:45,2006-12-31

Exemplo de leitura: import csv

# A leitura recebe um objeto arquivo

dt = csv.reader(file('dt.csv'))

# Para cada registro do arquivo, imprima for reg in dt:

print reg

Saída:

['temperatura', '15.0', 'C', '10:40', '2006-12-31'] ['peso', '42.5', 'kg', '10:45', '2006-12-31']

O formato CSV é aceito pela maioria das planilhas e sistemas de banco de dados para importação e exportação de informações.

60 Exceções

Exceções

Quando ocorre uma falha no programa (como uma divisão por zero, por exemplo) em tempo de execução, uma exceção é gerada. Se a exceção não for tratada, ela será propagada através das chamadas de função até o módulo principal do programa, interrompendo a execução.

print 1/0

Traceback (most recent call last): File "<input>", line 1, in?

ZeroDivisionError: integer division or modulo by zero

A instrução try permite o tratamento de exceções no Python. Se ocorrer uma exceção em um bloco marcado com try, é possível tratar a exceção através da instrução except. Podem existir vários excepts para um try.

try:

print1/0

except ZeroDivisionError:

print'Erro ao tentar dividir por zero.' # Mostra:

# Erro ao tentar dividir por zero.

Se except recebe o nome da exceção, só esta será tratada. Se não for passada nenhuma exceção como parâmetro, todas serão tratadas.

import traceback

# Tente receber o nome do arquivo try:

fn = raw_input('Nome do arquivo: ').strip()

# Numerando as linhas for i, s in enumerate(file(fn)): print i + 1, s, # Se ocorrer um erro except: # Mostre na tela trace = traceback.format_exc()

Exceções 61

# E salve num arquivo

print'Aconteceu um erro:\n', trace file('trace.log', 'a').write(trace)

# Encerre o programa

raise SystemExit

O módulo traceback oferece funções para manipular as mensagens de erro. A função format_exc retorna a saída da última exceção formatada em uma string.

O tratamento de exceções pode possuir um bloco else, que será executado quando não ocorrer nenhuma exceção e um bloco finally, será executado de qualquer forma, tendo ocorrido uma exceção ou não15. Novos tipos de exceções podem ser definidos através de herança a partir da classe Exception.

15 A declaração finally pode ser usada para liberar recursos que foram usados no bloco try, tais como conexões de banco de dados ou arquivos abertos.

62 Tempo

Tempo

O Python possui dois módulos para lidar com tempo:

time: implementa funções básicas para lidar com o tempo gerado pelo sistema

operacional.

datetime: implementa tipos de alto nível para lidar operações de data e hora. Exemplo com time:

# -*- coding: latin-1 -*- import time

# localtime() Retorna a data e hora local no formato # de uma tupla:

# (ano, mês, dia, hora, minuto, segundo, dia da semana, # dia do ano, horário de verão)

print time.localtime()

# asctime() retorna a data e hora como string, conforme # a configuração do sistema operacional

print time.asctime()

# time() retorna o tempo do sistema em segundos

ts1 = time.time()

# gmtime() converte segundos para tuplas no mesmo # formato de localtime()

tt1 = time.gmtime(ts1)

print ts1, '=>', tt1

# Somando uma hora

tt2 = time.gmtime(ts1 +3600.)

# mktime() converte tuplas para segundos

ts2 = time.mktime(tt2)

print ts2, '=>', tt2

# clock() retorma o tempo desde quando o programa # iniciou, em segundos

print 'O programa levou', time.clock(), \ 'segundos sendo executado até agora...' # Contando os segundos...

for i in xrange(5):

# sleep() espera durante o número de segundos

# especificados

Tempo 63 print i + 1, 'segundo(s)' Saída: (2008, 5, 11, 9, 55, 57, 6, 132, 0) Sun May 11 09:55:57 2008 1210510557.44 => (2008, 5, 11, 12, 55, 57, 6, 132, 0) 1210524957.0 => (2008, 5, 11, 13, 55, 57, 6, 132, 0)

O programa levou 1.53650813162e-006 segundos sendo executado até agora... 1 segundo(s)

2 segundo(s) 3 segundo(s) 4 segundo(s) 5 segundo(s)

Em datetime, estão definidos quatro tipos para representar o tempo:datetime: data e hora.

date: apenas data.

time: apenas hora.

timedelta: diferença entre tempos. Exemplo:

# -*- coding: latin-1 -*- import datetime

# datetime() recebe como parâmetros: # ano, mês, dia, hora, minuto, segundo # e retorna um objeto do tipo datetime

dt = datetime.datetime(2020, 12,31,23, 59, 59) # Objetos date e time podem ser criados

# a partir de um objeto datetime

data = dt.date() hora = dt.time()

# Quanto tempo falta para 31/12/2020

dd = dt - dt.today()

print 'Data:', data

print 'Hora:', hora

print 'Quanto tempo falta para 31/12/2020:', \ str(dd).replace('days','dias')

64 Tempo

Data: 2020-12-31 Hora: 23:59:59

Quanto tempo falta para 31/12/2020: 4616 dias, 13:22:58.857000

Introspecção 65

Introspecção

Introspecção ou reflexão é capacidade do software de identificar e relatar suas próprias estruturas internas, tais como tipos, escopo de variáveis, métodos e atributos.

Funções nativas do interpretador para introspecção:

Função Retorno

type(objeto) O tipo (classe) do objeto. id(objeto) O identificador do objeto.

locals() O dicionário de variáveis locais. globals() O dicionário de variáveis globais. len(objeto) O tamanho do objeto.

dir(objeto) A lista de estruturas do objeto. help(objeto) As Doc Strings do objeto. repr(objeto) A representação do objeto. isinstance(objeto, classe) Verdadeiro se objeto deriva da classe. issubclass(subclasse, classe) Verdadeiro se subclasse herda classe. O identificador do objeto é um número inteiro único que é usado pelo interpretador para identificar internamente os objetos.

Exemplo:

# -*- coding: latin1 -*-

# Colhendo algumas informações # dos objetos globais no programa from types import ModuleType

definfo(n_obj):

# Cria uma referência ao objeto

obj = globals()[n_obj]

# Mostra informações sobre o objeto

print'Nome do objeto:', n_obj print'Identificador:', id(obj) print'Tipo:', type(obj)

66 Introspecção

# Se for um módulo

if isinstance(obj, ModuleType): print'itens:'

for item in dir(obj): print item

print

# Mostrando as informações for n_obj in dir():

info(n_obj)

O Python também tem um módulo chamado types, que tem as definições dos tipos básicos do interpretador.

Através da introspecção, é possível determinar os campos de uma tabela de banco de dados, por exemplo.

No documento Python Para Desenvolvedores (páginas 58-66)

Documentos relacionados