1 de fev. de 2018

Python para Engenheiros de Redes - Parte VIII



Olá Pessoal Bom Dia, hoje vamos falar sobre tratamento de exceções e sobre arquivos.

Tratamento de Exceções:
Seja a seguinte função “div”, a qual recebe como parâmetros duas variáveis inteiras e retorna como resultado a divisão:

>>> def div(a,b):
...  return a/b
...
>>> div(10,2)
5
>>>

O que acontece se por alguma razão a variável “b” é zero:

>>> div(10,0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in div
ZeroDivisionError: integer division or modulo by zero
>>>

Como era de imaginar ele deu um erro, esse tipo de erro, que não é um erro de sintaxes do python, é chamado de exceção.

Sentença try...except:

Muitas vezes precisamos que essas exceções sejam tratadas, por exemplo enviadas para um arquivo de log, ou que seja executada uma determinada rotina etc.. Para isso podemos utilizar a sentença “try...except”.

A sentença “try...except” permite executar um bloco de código dentro do “try”, e caso dê alguma exceção, o bloco de código dentro do “except” será executado.

Vamos modificar a nossa função “div”, para poder tratar da exceção “ZeroDivisionError”:


>>> def div(a,b):
...  try:
...   return a/b
...  except:
...   print "Divisao por zero..porfavor inserir um novo número"
...
>>> div(10,0)
Divisao por zero..porfavor inserir um novo número
>>>



O código acima pode ser traduzido para: Tentar executar a divisão, caso dê alguma exceção, solicitar ao usuário inserir um novo número.

Podemos também especificar exatamente o tipo de exceção que queremos tratar por exemplo:


>>> def div(a,b):
...  try:
...   return a/b
...  except ZeroDivisionError:
...   print "Divisao por zero..porfavor inserir um novo número"
...
>>>



Podemos também, por alguma razão, não tratar o erro. Quem sabe estamos começando a escrever o código do nosso programa e ainda não sabemos o que fazer com as exceções. Nesses casos podemos utilizar a sentença “pass”


>>> def div(a,b):
...  try:
...   return a/b
...  except:
...   pass
...
>>> div(10,0)
>>>
>>>



Ao utilizar o “pass”, nada é feito no bloco “except”.


Arquivos:


Até agora temos visto como imprimir o resultado de alguma operação, variável na tela, porém é possível enviar o resultado para um arquivo de texto por exemplo.

Um arquivo pode ser de texto ou binário. Quando o arquivo é de texto cada linha termina com um “EOL”, end of line, geralmente o caráter utilizado como EOL é um ENTER. E o arquivo termina com um “EOF”, end of file, quando não se tem mais nada para ler.

Um arquivo binário, somente pode ser processado se você conhecer a estrutura do mesmo, se você abrir um arquivo binário, provavelmente vai parecer ininteligível.

Nesse curso vamos trabalhar unicamente com arquivos de texto.


Manipulando arquivos:


Para abrir um arquivo a sentença “open” é utilizada:

objeto_arquivo = open(“nome_do_arquivo”,”modo”)
O “objeto_arquivo”, contém todos os métodos e atributos que podem ser utilizados para coletar e manipular informação sobre o arquivo. Operações como escritura e leitura são feitas utilizando o “objeto_arquivo”. O “objeto_arquivo”, é conhecido como “file handle” em inglês, ou manipulador de arquivo na sua tradução literal.

Um arquivo pode ser aberto para diferentes tipos de operação, modos:

'r' – Modo leitura, não é possível escrever no arquivo.

'w' – Modo escritura, o arquivo é aberto para poder escrever nele, caso um arquivo com o mesmo nome já exista, o mesmo será apagado.

'a' – Modo escritura, porém preservando o conteúdo. Se não existir o arquivo é criado, se existir o conteúdo é adicionado no final do arquivo.

'+' - Modo leitura e escrita.


Vejamos alguns exemplos, de escrita e leitura:


Criando um arquivo teste.txt. O objeto manipulador vai ser a variável “fh”:


>>> fh = open("teste.txt","w")
>>>

O arquivo já aparece imediatamente no diretório:

jose@rejane:~/CloudGuru$ ls -ltrah
total 64K
-r-------- 1 jose jose 1,7K Nov 16 15:53 MyFirstVM.pem
-rwxrwxr-x 1 jose jose 177 Jan 19 21:27 connect.py
-rw-rw-r-- 1 jose jose 500 Jan 19 21:27 connect.pyc
-rwxrwxr-x 1 jose jose 256 Jan 19 21:32 testingconnection.py
-rwxrwxr-x 1 jose jose 174 Jan 24 10:01 teste.py
drwxr-xr-x 86 jose jose 32K Jan 24 13:37 ..
-rw-rw-r-- 1 jose jose 0 Jan 24 13:58 teste.txt
drwxrwxr-x 2 jose jose 4,0K Jan 24 13:58 .
jose@rejane:~/CloudGuru$



Escrevendo algum texto no arquivo e fechando o arquivo. Para escrever no arquivo utilizamos o método “write()”


>>> fh.write("Meu primeiro arquivo")
>>> fh.write("Meu primeiro arquivo - linha 2")
>>> fh.close()


Verificando o conteúdo:


jose@rejane:~/CloudGuru$ cat teste.txt
Meu primeiro arquivoMeu primeiro arquivo - linha 2jose@rejane:~/CloudGuru$
jose@rejane:~/CloudGuru$


O conteúdo foi escrito, porém tudo numa mesma linha :(. Vamos testar novamente dessa vez utilizando o caráter de nova linha ENTER “\n”.

Abrimos ele novamente para escrita:


>>> fh = open("teste.txt","w")
>>>

Como temos aberto o arquivo como escrita, o arquivo anterior foi apagado e recriado novamente, portanto ele está sem conteúdo:


jose@rejane:~/CloudGuru$ cat teste.txt
jose@rejane:~/CloudGuru$


Adicionando novas linhas, dessa vez com o caráter “\n”, e fechando o arquivo:

>>> fh.write("Meu primeiro arquivo\n")
>>> fh.write("Meu primeiro arquivo - linha2 \n")
>>> fh.close()


Verificando o conteúdo:

jose@rejane:~/CloudGuru$ cat teste.txt
Meu primeiro arquivo
Meu primeiro arquivo - linha2
jose@rejane:~/CloudGuru$


Vamos abrir o arquivo agora para adicionar uma linha a mais. Dessa vez abriremos o arquivo no modo “a” do inglês append:


>>> fh = open("teste.txt", "a")
>>> fh.write("Meu primeiro arquivo - linha3 \n")
>>> fh.close()
>>>

Verificando o conteúdo:

jose@rejane:~/CloudGuru$ cat teste.txt
Meu primeiro arquivo
Meu primeiro arquivo - linha2
Meu primeiro arquivo - linha3
jose@rejane:~/CloudGuru$



Podemos ver que a terceira linha foi adicionada no final do arquivo.

Agora vamos abrir o arquivo para uma operação de leitura. O método utilizado irá ser o “read()”:

>>> fh = open("teste.txt", "r")
>>> print fh.read()
Meu primeiro arquivo
Meu primeiro arquivo - linha2
Meu primeiro arquivo - linha3
>>> print fh.read()
>>>

Quando um um arquivo é aberto, existe o que se chama de “ponteiro”, a posição inicial de dito ponteiro é no inicio do arquivo. No exemplo acima quando executamos o comando “fh.read()”, todo o conteúdo do arquivo foi lido e impresso na tela, e o ponteiro foi parar no final do arquivo, é esse o motivo do porque ao executar o segundo “print fh.read()”, não apareceu nada na tela.

Para poder ver em qual posição encontra-se o ponteiro, podemos utilizar o método tell().

Vamos abrir o arquivo novamente:


>>> fh = open("teste.txt", "r")
>>> fh.tell()
0
>>> print fh.read()
Meu primeiro arquivo
Meu primeiro arquivo - linha2
Meu primeiro arquivo - linha3
>>> fh.tell()
83
>>> fh.close()
>>>


Podemos apreciar que inicialmente o ponteiro esta na posição “0”, é dizer no início do arquivo, quando executamos o fh.read(), todo o conteúdo é lido e o ponteiro vai parar no final do arquivo posição “83”.

E se quisernos ler somente alguns caracteres do arquivo, digamos os 5 primeiros caracteres:


>>> fh = open("teste.txt", "r")
>>> fh.tell()
0
>>> print fh.read(5)
Meu p
>>> fh.tell()
5
>>> fh.close()
>>>


A sentença “fh.read(5)”, vai ler os primeiros 5 caracteres (posições do ponteiro 0,1,2,3,4), depois de ler os 5 caracteres o ponteiro vai ficar na próxima posição no caso a 5.

Existe uma outra forma de ler arquivos de texto, e é linha a linha, essa é a forma mais utilizada para dizer a verdade. O método utilizado irá ser o “readline()”:


>>> fh = open("teste.txt", "r")
>>> print fh.readline()
Meu primeiro arquivo
>>> print fh.readline()
Meu primeiro arquivo - linha2
>>> print fh.readline()
Meu primeiro arquivo - linha3
>>> print fh.readline()
>>> fh.close()
>>>


Do exemplo podemos ver que toda vez que executamos um “fh.readline()” uma linha é lida, como o arquivo contem três linhas, três sentenças “readline()” foram necessárias.

Vamos melhorar o código acima e em vez de executar três sentenças “readline”, vamos ler o conteúdo dentro de um laço “for”.


>>> fh = open("teste.txt", "r")
>>> for line in fh:
...       print line
...
Meu primeiro arquivo
Meu primeiro arquivo - linha2
Meu primeiro arquivo - linha3
>>> fh.close()



Assim utilizando um único laço for, conseguimos ler linha por linha o arquivo.

Sentença With:


Toda vez que abrimos um arquivo, precisamos fechar o mesmo. Isso se faz necessário para não correr risco de por exemplo corromper o arquivo.

Quando um arquivo é aberto via sentença with, ele será fechado automaticamente, não sendo preciso a sentença close(), o with garante que o arquivo será fechado, inclusive se acontecer alguma exceção durante o processo de manipulação do arquivo.


>>> with open('teste.txt','w') as fh:
...  fh.write('Teste de With!!')
...
>>>
jose@rejane:~/Automatizacao$ more teste.txt
Teste de With!!
jose@rejane:~/Automatizacao$


Daqui para frente toda vez que trabalhemos com arquivos será utilizada a sentença with.



Bom pessoal por hoje é isso. Foram oito posts de python, que vão lhes dar os fundamentos para daqui para frente poder criar seus próprios scripts. Fica claro que existe muita coisa ainda para aprender, mas tendo como base o aprendido não irão ter problemas em assimilar novos conceitos.

Nos próximos posts, vamos criar aplicações, utilizando como base tudo o aprendido até agora.


Abcs e Obrigado
Jose CCIE#35681


Nenhum comentário:

Postar um comentário