Python Dig I Cad
Python Dig I Cad
DEV
Curso básico de:
Python para
iniciantes.
Sumário
1 - Introdução a Linguagem Python
2 - Variáveis, Tomada de Decisões
3 - Laços de Repetição
4 - Manipulação de Listas e Funções
5 - Arquivos JSON
6 - Dicionário de Dados e Tuplas
7 - Bibliotecas Externas
8 - Protocolos de Comunicação
9 - IoT
Responda:
Por que
Python?
Por que Python?
Python foi lançado em 1991 é a
linguagem de programação mais
utilizada no mundo de segurança da
informação.
Quando você gera o seu código-fonte em Python (arquivo com extensão .py),
você pode compilá-lo, o que irá gerar um arquivo com extensão .pyc (Python
Compile), que não é independente, e precisará da ferramenta que irá interpretar o
seu conteúdo, a qual chamamos de PVM (Python Virtual Machine). Logo, para
executar um arquivo compilado em Python, você não precisa do Python como
ferramenta, necessitará apenas da PVM instalada, ou seja, nesse processo ele
compilou e interpretou, logo é híbrido.
Download PyCharm
PyCharm, é um dos IDE's mais utilizadas para programação Python. Um IDE permite
programar em determinada linguagem e possui recursos que viabilizam a produtividade
e a praticidade durante o desenvolvimento e a execução do seu programa.
https://www.jetbrains.com/pycharm/download/
Vamos começar com Hello World ??
print("Hello World")
ou
mensagem = "Hello World"
print(mensagem)
Se eu falar para você: dezenove. O que significa? Você pode pensar: é uma
dezena ou é uma idade, é a temperatura ambiente ou é a quantidade de alunos, é a
quantidade de tarefas ou é a quantidade de pontos que uma equipe de basquete
realizou, enfim, o dado “dezenove” por si só não tem significado, pois pode ser qualquer
uma dessas hipóteses ou até mesmo todas as hipóteses.
Variavéis, Tomada de decisão e Estruturas de repetição
Regras: os três itens abaixo são obrigatórios e, caso não sejam seguidos,
tornarão o seu código inoperante e a sua aplicação não irá funcionar.
• O nome da variável não pode iniciar com um número. Exemplo: 1berto não
pode ser um identificador de variável.
Padrões: não são obrigatórios, mas são importantíssimos para que possamos
manter um código “clean” onde qualquer programador terá facilidade em realizar
a leitura do seu código e eventuais manutenções. Utilizar padrões é fazer uso de
uma boa prática de programação. Vamos aos padrões:
• Letras maiúsculas somente devem ser usadas quando você fizer uso de
duas ou mais palavras para compor o identificador de uma variável. A letra
maiúscula identifica o início de uma nova palavra, o que facilita muito para
outras pessoas que não conhecem o idioma do código que estiver sendo
lido/interpretado.
Variavéis, Tomada de decisão e Estruturas de repetição
Tipos de dados
Numérico;
Alfanumérico;
nome="Ricardo Galacho"
empresa='Digicad'
qtde_funcionarios=100
mediaMensalidade=2000.00
Se você executar o programa, não vai acontecer nada visualmente, pois você
está apenas criando as variáveis e atribuindo dados a elas. Repare no código
alguns
detalhes que podemos destacar:
Variavéis, Tomada de decisão e Estruturas de repetição
Na linha 1 incluímos um comentário para exibir o que está sendo feito no bloco;
Nas linhas 2 e 3, criamos variáveis do tipo String, ou seja, o conteúdo de uma variável
String deve sempre estar entre aspas/aspas duplas (“) ou entre apóstrofos/aspas
simples (‘).
Na linha 4, criamos uma variável do tipo int.
Na linha 5, criamos uma variável do tipo float. O caractere utilizado para casas
decimais é o ponto (.) seguindo o padrão americano, ou seja, vírgula separa casas de
milhar e ponto separa casas decimais.
Para que possamos exibir o conteúdo de cada variável, utilizaremos a função print(), por
isso, devemos acrescentar ao código as seguintes linhas:
• Na linha 8, exibimos o valor das duas primeiras variáveis, separadas por um texto;
para unir o conteúdo delas, utilizamos o operador “+”, que representa concatenação/junção
para string´s.
• Na linha 9, onde estamos exibindo a variável inteira e dois textos, utilizamos a “virgula” para
indicar o final do primeiro texto, a variável e o início do segundo texto, sem precisar converter
a variável numérica para string.
• Na linha 10, exibimos um texto e uma variável do tipo “float”, concatenadas através do
operador “+”. Para que o Python não tente realizar uma operação matemática, devemos
utilizar a função str() para converter o conteúdo da variável “float” para string, por isso a
variável mediaMensalidade está dentro da função str().
Variavéis, Tomada de decisão e Estruturas de repetição
Podemos exibir as variáveis numéricas (int ou float), com as string´s, utilizando a forma
definida na linha 8 ou conforme apresentado na linha 9. Execute e verá a saída dos dados das
variáveis transformada em informação para o usuário final. Caso não lembre como executar a
sua aplicação, clique no seu arquivo “Variaveis” com o botão direito e selecione a opção “Run
Variaveis”.
Entretanto, se você executar dez vezes o seu arquivo, verá a mesma mensagem, ou seja, suas
variáveis não estão variando tanto assim, não é mesmo? Por isso, vamos utilizar a função
input(), assim como a função print() exibe. A função input() permitirá que o usuário final
possa digitar um conteúdo em tempo de execução.
Execute e veja que as variáveis agora realmente estão funcionando como variáveis, pois, a
cada execução, os valores podem mudar. Atente-se que você deverá digitar os valores na
parte inferior da tela, conforme a imagem abaixo:
Variavéis, Tomada de decisão e Estruturas de repetição
Detalhe para as linhas 3 e 4 agora, onde estamos fazendo conversões de string para int (na
linha 3) e de string para float (na linha 4). Isso porque o input() captura apenas strings, logo
após capturado o valor, convertemos para o tipo de dado que desejamos armazenar em sua
respectiva variável.
Variavéis, Tomada de decisão e Estruturas de repetição
Tomada de decisão
Durante o desenvolvimento de um código, existem diversas situações em que a resolução
dependerá de um valor para que possa seguir um rumo e, consequentemente, que uma
tomada de decisão também seja seguida. Isso ocorre muito em nosso dia a dia quando
planejamos uma tarefa, mas as “variáveis” do nosso cotidiano fazem com que tenhamos que
optar por mudanças de planos.
Para que estas tomadas de decisões sejam possíveis, utilizaremos um comando condicional
muito conhecido em todas as linguagens de programação, identificado como “if”.
Decisões Simples:
Uma decisão simples é o caso mais comum e corriqueiro que existirá dentro de um código.
nome=input("Digite o nome: ")
idade=int(input("Digite a idade: "))
prioridade="NÃO"
if idade>=65:
prioridade="SIM"
print("O paciente " + nome + " possui atendimento prioritário? " + prioridade)
Variavéis, Tomada de decisão e Estruturas de repetição
Decisões Compostas:
nome=input("Digite o nome: ")
idade=int(input("Digite a idade: "))
if idade>=65:
print("O paciente " + nome + " POSSUI atendimento prioritário!")
else:
print("O paciente " + nome + " NÃO possui atendimento prioritário!")
Vamos utilizar os operadores “AND” ou “OR”, que nos permitem colocar duas
ou mais condições dentro de um único “if” e/ou “elif”. Quando utilizamos o operador
“AND”, queremos dizer que a condição que estiver à esquerda e a condição que
estiver à direita do operador devem ser verdadeiras para que o “if” seja considerado
Verdadeiro. Se uma das condições retornarem Falso, o “if” irá retornar Falso.
Já o operador “OR” determina que se uma das condições for verdadeira, o “if”
já deverá retornar “Verdadeiro”. Para simplificar o que queremos fazer, vamos
imaginar a seguinte situação: o paciente chega à triagem que o direcionará à sala de
espera da consulta.
Variavéis, Tomada de decisão e Estruturas de repetição
nome=input("Digite o nome: ")
idade=int(input("Digite a idade: "))
doenca_infectocontagiosa=input("Suspeita de doença infecto�contagiosa?").upper()
if idade>=65 and doenca_infectocontagiosa=="SIM":
print("O paciente será direcionado para sala AMARELA - COM prioridade")
elif idade < 65 and doenca_infectocontagiosa == "SIM":
print("O paciente será direcionado para sala AMARELA - SEM prioridade")
elif idade >= 65 and doenca_infectocontagiosa == "NAO":
print("O paciente será direcionado para sala BRANCA - COM prioridade")
elif idade < 65 and doenca_infectocontagiosa == "NAO":
print("O paciente será direcionado para sala BRANCA - SEM prioridade")
else:
print("Responda a suspeita de doença infectocontagiosa com SIM ou NAO")
Variavéis, Tomada de decisão e Estruturas de repetição
Decisões encadeadas
Podemos pensar em uma string que não tenha apenas os valores “SIM” e
“NAO”, como o estado civil, que pode ter mais do que simplesmente dois valores
(solteiro, casado, divorciado, viúvo etc.).
Você deve estar se perguntando: então, tanto faz usar decisão composta ou
decisão encadeada? Para o exemplo acima, poderíamos dizer que sim, mas, na
prática, não é bem assim. Observe que temos apenas duas condições (idade e
suspeita de doença infecto-contagiosa).
Além disso, a decisão encadeada foi desenvolvida para que se possa tomar
uma decisão somente quando outra decisão já foi definida como verdadeira ou falsa.
Variavéis, Tomada de decisão e Estruturas de repetição
Todas ?
Logo, não seria possível resolver essa situação, de maneira lógica e prática,
utilizando a decisão composta. Vamos criar outro arquivo chamado:
“DecisaoEncadeada2.py” e montaremos o seguinte código:
Este código é um pouco maior e possui algumas tomadas de decisão, percebe-se nesse
caso que a identação do código é extremamente importante no Python!
Variavéis, Tomada de decisão e Estruturas de repetição
Laços de repetições:
Estrutura While é a mais utilizada, funciona como um if mas a diferença é que executa o
bloco enquanto uma condição for verdadeira e não somenta uma vez:
Conseguiu verificar que a forma de usar (sintaxe) o “while” é idêntica à do comando “if”?
• Dentro da string que está dentro do print(), utilizamos o caractere “\t”
(lemos: contra barra t), cuja função é acrescentar uma tabulação antes do número, um
detalhe apenas para que o número não saia impresso colado na margem esquerda do
console.
Na linha 4, é o que garantimos que o nosso “while” seja finito, pois a condição é continuar
desde que o valor da variável “numero” seja menor que 100.
Variavéis, Tomada de decisão e Estruturas de repetição
Caso o valor digitado pelo usuário final seja um valor maior ou igual a 100,
nada que está dentro do laço será executado, o programa vai pular para a
linha 5, que está fora do laço, de acordo com a tabulação.
Você pode alterar na linha o valor “1” por outro número qualquer, a fim de
verificar que o valor da variável “numero” irá saltar de acordo com a
alteração que fizer nesta operação de soma (atribuição).
CLICA NO STOOOPPP
Variavéis, Tomada de decisão e Estruturas de repetição
Crie um arquivo chamado “For.py” dentro da pasta “Capitulo2” e monte o seguinte código:
for numero in range(1, int(input("Digite um numero para determinar o fim: ")), 1):
print("\t" + str(numero))
Para o comando “for”, perceba que criamos uma variável chamada “numero”
e dizemos que, de acordo com a função “range()” (que permite especificar uma faixa
de valores e como será incrementada), a variável iniciará com o valor 1 até o valor
que for digitado pelo usuário final. E esta faixa será incrementada de 1 em 1,
conforme o último valor especificado dentro da função range().
Variavéis, Tomada de decisão e Estruturas de repetição
Como já podemos perceber, esta forma de laço não é a mais adequada para
os momentos de preenchimento de dados de um projeto. Não temos como afirmar
quantos usuários serão cadastrados, ou quantos pacientes serão atendidos, este é
um caso típico para o “while”. Por outro lado, quando os dados já existem e
precisamos simplesmente exibi-los ou até mesmo realizar uma pesquisa dentro
deles, o “for” fica como o comando mais utilizado para percorrer todos os elementos
de um determinado conjunto
Usando o “for”, tente montar um código que exiba a tabuada de um valor que
será digitado pelo usuário final. Para isso, crie um arquivo chamado
“tabuada_for.py”. Não olhe o código a seguir, tente fazer primeiro, ok?
Variavéis, Tomada de decisão e Estruturas de repetição
Preparamos muitos códigos, mas muita coisa ainda vem pela frente. Procure
refazer, principalmente, os desafios deste capítulo, antes de entrar no próximo,
quando, então, explicaremos sobre listas, uma das principais estruturas de
armazenamento temporário do Python.
Listas e Funções
A solução, então, seria criarmos mil variáveis, pensando que o número mil jamais seria
alcançado? Não, em vez disso, iremos criar uma única e singela lista que pode armazenar
quantos usuários desejarmos.
Se ainda não ficou claro, vamos pensar em mais um exemplo: todas as máquinas da nossa
clínica possuirão um gerador de “log”, que nada mais é do que um arquivo do tipo texto
com informações capturadas em relação às ações do dia a dia. Podemos inserir no arquivo
de log informações sobre qual usuário acessou aquele computador e em qual horário
esteve ativo. Mais uma vez, não temos um valor exato. Qual a solução? Isso...utilizaremos
listas!!!
Então, podemos concluir que as listas armazenam uma quantidade
indeterminada de dados? Não é bem assim, pois existe o limite físico da memória do
seu computador, mas esse limite é tão grande que jamais chegaremos a alcançá-lo
dentro de uma situação profissional em que você faça uso das boas práticas e não
tenha intenções reais em “estourar a memória” do computador.
Listas e Funções
Como o input retorna uma string, devemos converter o dado para int (inteiro),
para, então, posteriormente, convertê-lo para bool (booleano). Não podemos fazer a
conversão diretamente de string para bool. O valor retornado será “False” somente
se o número informado for igual a zero, qualquer outro valor trará o retorno “True”.
Vamos adicionar dados agora ?
inventario=[]
resposta="S"
while resposta=="S":
inventario.append(input("Equipamento: "))
inventario.append(float(input("Valor: ")))
inventario.append(int(input("Número Serial: ")))
inventario.append(input("Departamento: "))
resposta=input("Digite \"S\" para continuar: ").upper()
Listas e Funções
inventario=[]
resposta="S"
while resposta=="S":
inventario.append(input("Equipamento: "))
inventario.append(float(input("Valor: ")))
inventario.append(int(input("Número Serial: ")))
inventario.append(input("Departamento: "))
resposta=input("Digite \"S\" para continuar: ").upper()
for elemento in inventario:
print(elemento)
Listas e Funções
A estrutura foreach nos permite definir um nome para cada elemento que ele
encontrar na lista. No nosso caso, chamamos de “elemento” e, então, ele irá
percorrer todas as posições da lista e exibir todos os valores. Poderíamos também,
em vez de criar uma única lista, criar uma lista para cada dado, por exemplo, uma
lista para equipamento, outra para valor, número serial e departamento,
respectivamente. Vamos tentar? Crie um novo arquivo chamado: “MultiplasListas.py”
e tente montar o código sozinho, antes de continuar a leitura.
equipamentos = []
valores = []
seriais = []
departamentos = []
resposta = "S"
while resposta == "S":
Listas e Funções
equipamentos.append(input("Equipamento: "))
valores.append(float(input("Valor: ")))
seriais.append(int(input("Número Serial: ")))
departamentos.append(input("Departamento: "))
resposta = input("Digite \"S\" para continuar: ").upper()
for equipamento in equipamentos:
print("Equipamento: ", equipamento)
Repare agora que estamos utilizando quatro listas, mas que o nosso “for”
somente mostra os nomes dos equipamentos, que é o conteúdo da lista
“equipamentos”. E para saber os outros dados? Precisaríamos criar mais três laços
com o “for”? A resposta é...não. Podemos utilizar os índices, como veremos no
próximo tópico.
Listas e Funções
Índice
equipamentos = []
valores = []
seriais = []
departamentos = []
resposta = "S"
Listas e Funções
Índice
Índice
A estrutura do nosso “for” mudou, agora não estamos trabalhando com base
nos elementos diretamente, mas, sim, de acordo com o índice. Para a variável
“índice” que criamos no “for”, será atribuído o valor de 0 até a quantidade de
elementos que existirem dentro da nossa lista “equipamentos” (função “len()”), que
obviamente será a mesma quantidade de elementos que existirão nas listas: valores,
seriais e departamentos, conforme apresentado nas tabelas do tópico anterior, deste
mesmo capítulo.
Com o índice em mãos, poderemos recuperar os dados de todas as nossas listas e a saída
dos dados ficará muito mais apresentável.
Listas e Funções
No código acima, criamos uma lista para armazenar somente os valores dos
equipamentos, preenchemos a mesma dentro do “for” e, depois de ser
preenchida, verificamos se a lista possui ao menos um valor, e, se a condição for
verdadeira, as funções abaixo serão executadas:
• “max()”: que retorna o maior valor numérico dentre os elementos da lista;
• “min()”: que retorna o menor valor numérico dentre os elementos da lista; e
• “sum()”: que retorna o total entre os valores que estão na lista.
Encerramos o nosso assunto de listas por aqui, espero que tenham gostado.
Existem mais funções que podem ser utilizadas, mas, para o propósito do curso,
este conteúdo sobre listas já é o suficiente. Observe o seu último arquivo criado…
Ficou extenso, não é mesmo? Vamos falar sobre funções ??
Funções
Até agora trabalhamos com diversas funções: int(), str(), float(), input(), print()… Todas elas
já fazem parte da linguagem Python e estão incorporadas na nossa PVM (Python Virtual
Machine). Agora vamos imaginar se, por acaso, não existissem as funções. Para facilitar,
vamos pensar em uma delas, a input(). Se ela não existisse, a todo momento teríamos que,
dentro do nosso código, montar uma sequência de outros códigos para que o usuário
pudesse digitar uma informação, isso poderia levar, por exemplo, 15 linhas. Ou seja, em vez
de utilizarmos um simples input(), deveríamos utilizar 15 linhas. Agora conte quantos
inputs utilizou em nosso último arquivo de código gerado e multiplique por 15…
Assustador, não é mesmo?!
• Para criarmos funções, utilizaremos o comando “def”, e a estrutura básica de uma função
é a seguinte:
def <identificador da funcao> (<parametro(s)>):
<código que será executado>
return <Dado que será retornado, caso seja necessário>
O parâmetro é um dado que será fornecido para que a função possa executar o seu
bloco de códigos. É como se fossem os ingredientes de uma receita, por exemplo,
para que uma função possa calcular uma média aritmética entre duas notas, você
deverá fornecer as duas notas ou ainda para que uma função calcule o salário
líquido de um colaborador,precisará informar para a função, no mínimo, o salário
bruto.
O código a ser executado representa o conjunto de códigos que possuem
uma mesma finalidade dentro da aplicação.
• A última linha de “return” é opcional e deve ser usada somente quando
você desejar que a função retorne um valor para o módulo principal.
Cientes dessas informações, vamos colocar em prática. Criaremos a primeira
função, que terá a finalidade de preencher o inventário. Por isso, iremos chamá-la
de preencherInventario(). Dentro do nosso novo arquivo
“IdentificacaoDeFuncoes.py”, digite o seguinte código:
def preencherInventario(lista):
resp="S"
while resp == "S":
equipamento=[input("Equipamento: "),
float(input("Valor: ")),
int(input("Número Serial: ")),
input("Departamento: ")]
lista.append(equipamento)
resp = input("Digite \"S\" para continuar: ").upper()
def preencherInventario(lista):
resp="S"
while resp == "S":
equipamento=[input("Equipamento: "),
float(input("Valor: ")),
int(input("Número Serial: ")),
input("Departamento: ")]
lista.append(equipamento)
resp = input("Digite \"S\" para continuar: ").upper()
def exibirInventario(lista):
for elemento in lista:
print("Nome.........: ", elemento[0])
print("Valor........: ", elemento[1])
print("Serial.......: ", elemento[2])
print("Departamento.: ", elemento[3])
Ficou muito mais clean a leitura do módulo principal, não é mesmo? Repare
que somente a função excluirSerial() foi chamada dentro do print(), isso porque
somente ela possui retorno. Veja também a economia de linhas quando apenas
chamamos duas vezes a função exibirInventario(), em vez de repetir todas as linhas
que estão dentro dessa função. E vamos pensar na hipótese das centenas de filiais
que podem aparecer, cada uma com sua necessidade. Não será problema algum
agora, pois passaremos o nosso módulo e a filial irá reaproveitar as funções que
desejar, assim, não teremos que ficar separando linhas.
Manipulação de Dados e Tupla
Usuario 1: Login - Chaves, Nome - Chaves Silva, Último Acesso: 17/05/2023, Estação: Recep_01
Usuário 2: Login - Quico, Nome - Enrico Flores, Último Acesso: 03/05/2023, Estação: Raiox_02
Vamos iniciar considerando apenas os dados encontrados acima, ou seja, todo usuário
(colaborador da clínica) terá registrado um login (que é único, porque não podemos ter dois
usuários com o mesmo login), nome, a data do último acesso (futuramente poderemos
pensar na hora também, e a estação que ele logou pela última vez). Alguns outros dados
parecem ser importantes a fim de complementarmos o registro do usuário como: cargo,
departamento, nível de acesso (usuário, administrador, gerente etc.), entre outros, mas, no
momento, vamos adotar apenas estes para fins didáticos.
Manipulação de Dados e Tupla
Você precisa, a princípio, pensar em uma estrutura que receba os dados dos usuários para
que você possa examiná-los, a fim de identificar alguma “anomalia”, por exemplo, um
usuário que aparece acessando uma estação que está em um departamento que ele não
atua ou um último acesso localizado em uma data em que o departamento dele não abriu
oficialmente. Você pensaria em criar uma estrutura através de lista?
Pois é, essa não seria a situação mais indicada para as listas. Por quê? Vamos ver um dos
motivos: se pensarmos em uma lista para cada usuário, quantas listas exatamente
precisaremos criar no código? Não conseguiremos definir, pois o número de
colaboradores não é fixo e podemos ter mais ou menos do que planejado, por falta, férias,
folga, novas contratações, entre outras possibilidades.
Manipulação de Dados e Tupla
Então, você pensa em criar uma lista para colaboradores e, dentro dela, outras listas que
irão armazenar os dados efetivamente de cada colaborador. Mas, pense... cada vez que o
usuário logar em uma estação, os dados deverão ser atualizados (data do último acesso e
a última estação acessada), ou seja, como em listas você não tem como localizar um dado
diretamente, você terá que percorrer (estruturas de repetição) toda a lista todas as vezes
que todos os colaboradores realizarem um logon.
Para a Receita Federal, cada pessoa física é um objeto que possui vários
dados: nome, endereço, CPF, RG, estado civil, telefone, entre outros. Qual entre
estes dados representa um único objeto, ou seja, uma única pessoa física para a
Receita Federal? Isso mesmo, o CPF. Ele é único para cada pessoa física e com
isso, poderia ser a chave. Outro exemplo: um ativo de rede, dentro da clínica, deverá
fazer parte de um inventário e, por isso, será necessário guardar dados sobre ele,
como: descrição, modelo, fabricante, valor de compra, data da aquisição, entre
outros.
Manipulação de Dados e Tupla
Agora podemos ver como representaremos os dicionários dentro do Python. Abra o nosso
projeto e, consequentemente, crie um Python Package.
Atribua para este pacote o nome: “Capitulo4_Dicionarios” e crie um arquivo python com
nome Dicionarios1.py
Dentro do arquivo criado, monte o código abaixo:
usuarios={}
usuarios={
"Chaves":["Chaves Silva","17/06/2017","Recep_01"],
"Quico":["Enrico Flores","03/06/2017","Raiox_02"]}
chave “Quico” (que teve como último acesso a estação “Raiox_03”) e o último com a
chave “Florinda” (com a data “26/11/2016” atribuída ao último acesso).
Veremos agora como podemos retornar os dados de um objeto da lista,
acrescente no seu código as linhas abaixo:
Manipulação de Dados e Tupla
Veremos agora como podemos retornar os dados de um objeto da lista, acrescente no seu
código as linhas abaixo:
print(usuarios)
print("##############========#########")
print("Dados: ",usuarios.get("Chaves"))
Veja como o código ficou muito mais limpo, neste que será o nosso módulo
principal. Não se esqueça de fazer a importação, que está na primeira linha do
código. Agora, nos resta montar as outras funções e implementá-las dentro deste
módulo principal. Topa o desafio? Abra o seu arquivo “funcoes.py” e crie as funções:
pesquisar() – dica: você precisará receber como parâmetro a chave e o dicionário,
excluir() – dica: você precisará utilizar o comando “del”, e listar(). Depois volte para o
material e confira o seu código, com a nossa proposta logo abaixo:
Manipulação de Dados e Tupla
def pesquisar(dicionario, chave):
lista = dicionario.get(chave)
if lista is not None:
print("Nome...........: " + lista[0])
print("Último acesso..: " + lista[1])
print("Última estação.: " + lista[2])
def listar(dicionario):
for chave, valor in dicionario.items():
print("Objeto......")
print("Login: ", chave)
print("Dados: ", valor)
Manipulação de Dados e Tupla
O código acima é responsável por criar as outras três funções. Observe
alguns detalhes:
• Na função pesquisar(), precisamos receber o dicionário (onde se pretende
pesquisar) e a chave (o dado que será pesquisado). Logo após, vamos
preencher uma lista com o resultado da pesquisa proveniente do uso da
função get(). Verificamos se a lista não está vazia (!= - representa
diferente), caso esta condição seja verdadeira, vamos exibir os três dados
que compõem a lista. Teremos, na primeira posição (zero), o nome do
usuário; na segunda posição (um), a última data de acesso; e na terceira
posição (dois), a última estação acessada. Caso não encontre a chave,
não será retornada nenhuma mensagem;
E está aí tudo pronto e funcional, fácil, não é mesmo? Você deve estar se
perguntando, por que não realizamos uma função para alterar os dados de um
objeto já armazenado na lista? Simples, caso o usuário final digite ao incluir uma
mesma chave, todos os dados que ele inserir vão sobrescrever os dados do objeto
que já estavam armazenados, logo, não se faz necessário nesse momento uma
função para realizar alterações.
Tuplas
ips={}
resp="S"
while resp=="S":
ips[(input("Digite os dois primeiros octetos: "),
input("Digite os dois últimos octetos: "))]=input("Nome da máquina: ")
resp=input("Digite <S> para continuar: ").upper()
Nesse arquivo, iremos montar o código abaixo. Quando for executá-lo, ele
não irá funcionar, explicaremos no parágrafo seguinte:
Esse código irá gerar um novo arquivo e escrever “Nunca foi tão fácil criar um
arquivo”. O arquivo será encerrado, em seguida, aberto novamente e, então, a frase
“Continuação do texto” será escrita nele, mas, ao abri-lo, você irá encontrar apenas
a segunda frase, isso porque o primeiro arquivo foi sobrescrito e não concatenado.
Essa é a função da opção “a”, que podemos utilizar no segundo parâmetro, altere
somente no segundo with o “w” por “a” e veja como irá funcionar melhor agora.
Vamos abrir um novo arquivo e gerar um html simples, para que você possa ter a
noção exata do quão importante pode ser a geração de um arquivo dentro de uma
linguagem de programação. Crie um novo arquivo chamado “ArquivoHTML.py” e
monte o seguinte código:
Manipulação de Arquivos e JSON
with open("pagina.html", "w") as pagina:
pagina.write("<body> <h1> Esta é um teste para página WEB </h1>")
pagina.write("<br><h2> Abaixo seguem alguns nomes importantes para o
projeto: </h2>")
pagina.write("<h3>")
nome=""
while nome!="SAIR":
nome = input("Digite um nome ou SAIR: ").upper()
if nome!="SAIR":
pagina.write("<br>"+nome)
pagina.write("</h3></body>")
Nesse código, abrimos o arquivo, teste.txt, para leitura (“r”) e atribuímos, para
a variável “conteudo”, todo o conteúdo do arquivo (quando utilizamos o método
read()), depois, imprimimos o tipo da variável e, na última linha, imprimimos o
conteúdo do arquivo que está dentro da variável. O tipo de dado da variável
“conteudo” que será exibido é “str”, ou seja, string, isso porque, quando não
definimos o modo de saída, o valor-padrão é o “t”(text), por isso “r” ou “rt” ou “r+t”
como segundo parâmetro retornarão o mesmo tipo.
Manipulação de Arquivos e JSON
Podemos mudar para que a saída seja em bytes, para isso, substitua “r” por “rb” ou “r+b” e
execute novamente esse bloco de código; verá que não só o tipo mudará para “byte” como
também o conteúdo do arquivo a ser exibido terá uma formatação diferente, por byte. O
mais comum mesmo é fazê-lo utilizando a saída no formato texto, não é à toa que ele é a
forma-padrão.
Outra alteração simples refere-se à forma como podemos retornar o conteúdo
do arquivo. No código anterior, utilizamos a função read(), que retornará todo o
conteúdo como se fosse uma única string. Façamos o seguinte teste: substitua
read() por readlines() e execute novamente o seu código. Percebeu a diferença? A
saída da variável “conteudo” não é mais uma string e, sim, uma lista formada por
duas posições, uma para cada linha.
Será muito útil a função readlines() quando optarmos por quebrar um grande
arquivo de texto em partes, para que possamos retirar somente os dados que nos
interessarem. Por falar nisso, vamos para um exemplo prático, no qual poderemos
explorar mais ainda os conceitos, funções e métodos apresentados até o momento
Manipulação de Arquivos e JSON
Gerando uma rotina para inventário
Uma das suas atribuições dentro do projeto será a de gerir todo o inventário
de ativos que fazem parte da rede do seu cliente. É fundamental saber quantos são,
quais são e onde estão distribuídos os ativos que fizerem parte da rede. Além disso,
muitas outras informações podem ser devidamente documentadas, como licenças
de softwares, controle sobre o que deve trafegar na rede ou em partes dela, local
definido para armazenamento de dados específicos, controle de atualizações, enfim,
o gerenciamento e a segurança de uma rede, sem dúvida, começam com um
inventário gerenciado, atualizado e funcional.
Montaremos uma rotina pequena e simples, a princípio, para que possamos
praticar as técnicas para a manipulação de arquivos vistas até o momento, com uma
aplicação prática que, com certeza, fará parte das suas atribuições como um
profissional de defesa cibernética. Vamos começar criando um novo arquivo
chamado: “Inventario.py” e iremos armazenar apenas os seguintes dados: o número
patrimonial do ativo, a descrição do ativo, data da última atualização e o nome do
departamento em que está localizado.
Manipulação de Arquivos e JSON
Primeiro iremos definir uma estrutura de dados para armazená-lo; eles serão recebidos
pelo colaborador responsável por catalogar os ativos, e, então, persistiremos os dados
para um arquivo, para que possam ser recuperados, “backupeados”, alterados, excluídos e
estejam disponíveis para qualquer outra consulta que possa ser necessária
posteriormente. Utilizaremos uma estrutura de um dicionário de dados para armazená-
los enquanto estiverem na condição de dados voláteis, em que a chave será o número
patrimonial do ativo (que não pode ser repetido). Sobre essa chave, teremos uma
lista com o departamento, data da última alteração e descrição. Após a gerência dos
dados no dicionário, iremos persistir em um arquivo do tipo “csv”, que representa um
padrão de arquivo no qual os dados poderão ser abertos dentro do Excel e de outros
programas que aceitam esse tipo de arquivo. Isso irá garantir maior flexibilidade e
portabilidade sobre os dados persistidos. Agora, vamos montar o seguinte código:
inventario = {}
opcao = int(input("Digite: "
"\n<1> para registrar ativo"
"\n<2> para persistir em arquivo"
"\n<3> para exibir ativos armazenados: "))
Manipulação de Arquivos e JSON
while 0 < opcao < 4:
if opcao == 1:
resp = "S"
while resp == "S":
inventario[input("Digite o número patrimonial: ")] = [
input("Digite a data da última atualização: "),
input("Digite a descrição: "),
input("Digite o departamento: ")]
resp = input("Digite <S> para continuar.").upper()
elif opcao == 2:
with open("inventario.csv", "a") as inv:
for chave, valor in inventario.items():
inv.write(chave + ";" + valor[0] + ";" +
valor[1] + ";" + valor[2] + "\n")
print("Persistido com sucesso!")
elif opcao == 3:
with open("inventario.csv", "r") as inv:
print(inv.readlines())
Manipulação de Arquivos e JSON
opcao = int(input("Digite: "
"\n<1> para registrar ativo"
"\n<2> para persistir em arquivo"
"\n<3> para exibir ativos armazenados: "))
def chamarMenu():
escolha = int(input("Digite: "
"\n<1> para registrar ativo"
"\n<2> para persistir em arquivo"
"\n<3> para exibir ativos armazenados: "))
return escolha
def registrar(dicionario):
resp="S"
while resp=="S":
dicionario[input("Digite o número patrimonial: ")]=[
input("Digite a data da última atualização: "),
input("Digite a descrição: "),
input("Digite o departamento: ")]
resp=input("Digite <S> para continuar.").upper()
Manipulação de Arquivos e JSON
def persistir(dicionario):
with open("inventario.csv", "a") as inv:
for chave, valor in dicionario.items():
inv.write(chave + ";" + valor[0] + ";" +
valor[1] + ";" +valor[2]+"\n")
return "Persistido com sucesso"
def exibir():
with open("inventario.csv", "r") as inv:
linhas=inv.readlines()
return linhas
data = separacao[0:separacao.find(";")]
separacao = separacao[separacao.find(";")+1:-1]
Manipulação de Arquivos e JSON
descricao=separacao[0:separacao.find(";")]
e Agora o Departamento:
departamento=linha[linha.rfind(";")+1:-1]
Compare com a solução anterior e veja o quão simples foi essa solução
proposta. Apesar de as duas funcionarem e retornarem as informações desejadas, a
segunda proposta, com o método split(), é muito mais prática e rápida de ser
implementada. Sempre que manipular Strings, terá várias formas de chegar ao mesmo
resultado, mas, quando achar que o seu código está muito extenso e
repetitivo, procure saber se não existe algum método capaz de simplificar o que
você deseja realizar.
Manipulação de Arquivos e JSON
Manipulando arquivos de terceiros
Até o momento, manipulamos dados e arquivos que nós mesmos
organizamos e criamos e, sem dúvida, esse é o mundo perfeito. Entretanto, em
muitas ocasiões, você deverá realizar a leitura e recuperar dados de arquivos de
terceiros, como, por exemplo, logs gerados pelo sistema operacional, arquivos de
configuração de roteadores e outros equipamentos ou ainda arquivos gerados por
ferramentas de outros programadores. Por isso, nesse tópico, realizaremos o tratamento
dos dados de um arquivo de terceiro, a fim de praticarmos e fixarmos os métodos, sobre
Strings e arquivos, abordados até o momento e também para que possamos praticar um
pouco mais a lógica para o trabalho com arquivos. Vamos lá.
Comece acessando o link: https://data.boston.gov/dataset/economic�indicators-legacy-
portal, que irá direcioná-lo para uma página que permitirá realizar o
download de um arquivo “csv”, que contém indicadores oficiais relacionados à
economia da cidade de Boston-EUA.
Após baixar o arquivo, arraste-o para dentro do pacote 3_3_ManipulaArquivos
e crie o arquivo Boston.py. Abra o arquivo “economic-indicators.csv” e você irá
encontrar, na primeira linha, as siglas dos indicadores e, nas linhas subsequentes,
os dados separados por vírgula, seguindo a ordem dos indicadores.
Manipulação de Arquivos e JSON
Para facilitar
nossa análise, seguem, a seguir, os significados das siglas, encontradas na primeira
linha do arquivo, que utilizaremos para o nosso exemplo:
• Year = ano do dado
• Month = mês do dado
• logan_passengers = quantidade de passageiros, internacionais e
domésticos, que passaram pelo aeroporto de Logan.
• logan_intl_flights = total de voos internacionais que partiram do aeroporto
de Logan.
• hotel_occup_rate = porcentagem de vagas ocupadas nos hotéis de
Boston.
• hotel_avg_daily_rate = média da diária, em dólar, de um hotel em Boston.
• total_jobs,unemp_rate = porcentagem de desempregados em Boston.
Execute e lance dois ativos no inventário, depois disso, encerre sua aplicação
e veja que surgiu o arquivo “inventario_json.json”.
E, então, reconheceu algo na estrutura do arquivo? Parece com alguma
estrutura de dados que vimos dentro do Python? Sim, isso mesmo! É o dicionário de
dados, isso significa que a estrutura do JSON não o assusta, pois já manipulamos
bastante a estrutura de dicionário de dados por meio da chave e dos dados.
Continuando a explicação do código, na opção “2”, abrimos o nosso arquivo
em modo de leitura apenas e, então, chamamos o método load(), que também
pertence ao objeto “json”. Ele descarrega o arquivo informado no parâmetro para
uma variável, no nosso exemplo, a variável “resultado”. Em seguida, montamos um
laço “foreach”, que irá trazer a chave (número patrimonial) e os dados (uma lista com
data, descrição e departamento); finalizamos com a exibição e o menu de opções
novamente.
Manipulação de Arquivos e JSON
Agora perceba que, como não utilizamos, na opção “1”, o modo de
concatenação, se você executar novamente o seu código, verá que o seu arquivo
anterior será sobrescrito, isto é, se você lançar um ativo, o seu arquivo ficará apenas
com um ativo e não mais com três (considerando os outros dois que você preencheu
anteriormente). Para solucionar isso, faremos uma alteração na estrutura do nosso
código, ao invés de criarmos o dicionário “inventario” vazio, já o criaremos
preenchido pelo arquivo, assim, a nossa opção “1” irá adicionar mais um objeto ao
dicionário, que já estará preenchido com o conteúdo do arquivo e, finalmente,
quando for realizar a gravação, irá gravar todos os objetos que estiverem no
dicionário. Veja como ficará o código:
import json
with open("inventario_json.json", "r") as arq_json:
inventario = json.load(arq_json)
opcao=int(input("Digite: \n<1> para registrar ativo"
"\n<2> para exibir ativos armazenados: "))
while opcao>0 and opcao<3:
if opcao==1:
resp = "S"
Manipulação de Arquivos e JSON
while resp == "S":
inventario[input("Digite o número patrimonial: ")] = [
input("Digite a data da última atualização: "),
input("Digite a descrição: "),
input("Digite o departamento: ")]
resp = input("Digite <S> para continuar.").upper()
with open("inventario_json.json", "w") as arq_json:
json.dump(inventario, arq_json)
print("JSON gerado!!!!")
elif opcao==2:
for chave, dado in inventario.items():
print("Data.........: ", dado[0])
print("Descrição....: ", dado[1])
print("Departamento.: ", dado[2])
opcao = int(input("Digite: "
"\n<1> para registrar ativo"
"\n<2> para exibir ativos armazenados: "))
Manipulação de Arquivos e JSON
As alterações estão destacadas pela cor vermelha. Criamos o nosso dicionário
“inventario”, já o preenchendo com o conteúdo do arquivo “inventario_json.json”. Na
opção “2”, de exibição, basta utilizarmos o dicionário “inventario” no “foreach”, assim
percorreremos todos os dados de maneira atualizada.
Mas, agora, vamos para um pequeno problema. Elimine o arquivo “inventario_json.json”,
para isso, clique com o botão direito sobre o arquivo, escolha a opção “Delete”, clique no
botão “OK” e, no painel debaixo do PyCharm,normalmente irá aparecer um botão com o
texto “Do Factor”, clique sobre ele para confirmar a exclusão. Rode novamente a aplicação
e, então, verá um erro que ocorrerá porque o Python não localizou o arquivo para
preencher o dicionário “inventario”.
Uma forma simples para resolver esse problema é identificar se o arquivo já
existe. Para isso, precisaremos importar o pacote “os” (Operation System), que
permite acessar objetos e funções referentes ao sistema operacional. Uma dessas
funções é a “path.exists()”, que retorna “True”, caso encontre o arquivo especificado
como parâmetro, ou “False”, se o arquivo não for encontrado. Por isso, nossa
alteração será realizada somente no início do código, conforme podemos observar
na sequência a seguir:
Manipulação de Arquivos e JSON
import json
import os
if os.path.exists("inventario_json.json"):
with open("inventario_json.json", "r") as arq_json:
inventario = json.load(arq_json)
else:
inventario={}
opcao=int(input("Digite: \n<1> para registrar ativo"
"\n<2> para exibir ativos armazenados: "))
Observe, nas linhas que estão na cor vermelha, que colocamos uma condição
para a criação ou preenchimento do dicionário “inventario”, que é: se o arquivo
existir, então, preencha o dicionário com o conteúdo do arquivo, caso contrário (se o
arquivo não existir), crie o dicionário “inventario” vazio. Pronto!
Pronto? Podemos melhorar um último detalhe, que é o fato de modularizar,
isso significa aplicar as funções. Vamos lá! Crie, no pacote “Funcoes”, o arquivo
“Funcoes_JSON.py” e digite o código seguinte:
Manipulação de Arquivos e JSON
import json
import os
def chamarMenu():
escolha = int(input("Digite: "
"\n<1> para registrar ativo"
"\n<2> para exibir ativos armazenados: "))
return escolha
def ler_arquivo(arquivo):
if os.path.exists(arquivo):
with open(arquivo, "r") as arq_json:
dicionario=json.load(arq_json)
else:
dicionario = {}
return dicionario
def gravar_arquivo(dicionario,arquivo):
with open(arquivo, "w") as arq_json:
json.dump(dicionario, arq_json)
Manipulação de Arquivos e JSON
def registrar(dicionario, arquivo):
resp = "S"
while resp == "S":
dicionario[input("Digite o número patrimonial: ")] = [
input("Digite a data da última atualização: "),
input("Digite a descrição: "), input("Digite o departamento:
")]
resp = input("Digite <S> para continuar.").upper()
gravar_arquivo(dicionario,arquivo)
return "JSON gerado!!!!"
def exibir(arquivo):
dicionario = ler_arquivo(arquivo)
for chave, dado in dicionario.items():
print("Data.........: ", dado[0])
print("Descrição....: ", dado[1])
print("Departamento.: ", dado[2])
Manipulação de Arquivos e JSON
Nesse arquivo, criamos algumas rotinas tão abstratas que poderiam funcionar
com qualquer aplicação que tivesse a função de manipular arquivos JSON, é o caso
das funções: ler_arquivo() e gravar_arquivo(). Para qualquer situação envolvendo
arquivos JSON, elas podem ser reaproveitadas, tanto que as próprias funções
registrar() e exibir() utilizam essas funções.
Agora sim, podemos pensar no nosso arquivo “Manipular_JSON.py”, que
ficará muito mais “clean”, conforme podemos perceber no código a seguir:
from Funcoes.Funcoes_JSON import *
inventario = ler_arquivo("inventario_json.json")
opcao=chamarMenu()
while opcao>0 and opcao<3:
if opcao==1:
print(registrar(inventario, "inventario_json.json"))
elif opcao==2:
exibir("inventario_json.json")
opcao = chamarMenu()
Manipulação de Arquivos e JSON
from Funcoes.Funcoes_JSON import *
inventario = ler_arquivo("inventario_json.json")
opcao=chamarMenu()
while opcao>0 and opcao<3:
if opcao==1:
print(registrar(inventario, "inventario_json.json"))
elif opcao==2:
exibir("inventario_json.json")
opcao = chamarMenu()
Finalizando o capítulo
Para finalizar este capítulo, você poderá aplicar todos os conceitos vistos,
desenvolvendo uma ferramenta mais completa para catalogar o inventário do seu
cliente. Armazene tudo em arquivo e crie, pelo menos, duas formas de saídas, por
modelos, atualizações e valores, por exemplo.
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
Nosso código agora irá alcançar voos mais altos e mais distantes. Chegou a
hora de apresentar o mundo exterior ao Python. Muitos recursos virão e as
possibilidades de aplicação aumentarão exponencialmente. Prontos para receberem
os kits de superpoderes? Vamos lá...
Seu código, até agora, teve contato apenas com recursos internos e padrões
do Python, que já existiam dentro da PVM que reina em seu computador. Comandos
e funções que compõem a linguagem, como: if, while, for, open(), split(), len(), upper(),
entre tantos outros que já abordamos, nós aprendemos a usá-los sem fazer qualquer
referência, isso porque esses comandos/funções/recursos já estão liberados para
utilização.
Instalando Geopy
Usando Geopy
Agora que o pacote está devidamente instalado, vamos montar o nosso código.
Para isso, abra o nosso projeto no PyCharm, crie um novo “Python Package”,
chamado: “5_1_Wazeyes”, dentro dele, crie um arquivo “Python File”, chamado
“Converter_geolocalizacao.py” e digite o seguinte código:
o
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
Com as linhas, já conseguimos a parte do código que deveria ser a mais difícil,
isto é, capturamos uma string que representa um endereço e convertemos para as
coordenadas geográficas latitude e longitude, para que possam ser aplicadas, por
outra aplicação, sobre um mapa. Agora, a missão é criar um arquivo JSON com um
endereço, consumi-lo, gerar as coordenadas e gravar em outro arquivo JSON. Nesse
momento, antes de seguir a leitura da sequência do código a seguir, aproveite para
treinar, crie o arquivo JSON (conforme a figura seguinte) e produza o código que irá
ler o arquivo do endereço e gerar outro arquivo com as coordenadas, vamos lá!
o
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
Praticamente, em cada linha, temos um conceito e uma estrutura diferentes.
Por isso, é muito importante que você conheça bem as estruturas de dados já
abordadas. Se ainda você se sentir desconfortável em utilizar qualquer uma das
estruturas, não deixe para depois. Pratique mais (não é decorar – é praticar), refaça
exercícios, procure aplicações no seu cotidiano, mesmo que sejam bem simples e que
você nem chegue a implementá-las posteriormente, mas não deixe de praticar até
dominar as estruturas básicas que o Python disponibiliza.
• Latitude: -23.5740406
• Longitude: -46.623408900000015
Logo obterá o endereço completo, e mais três dados exibidos separadamente.
Observe que, por meio de uma necessidade real, na aplicação “Wazeyes”,
tivemos a oportunidade de aprender muito sobre geolocalização e, melhor que isso,
percebemos que muitos códigos estão prontos, é só conhecer, pesquisar sobre o
pacote externo e aplicar os conhecimentos adquiridos sobre os conceitos
apresentados anteriormente. O que isso tem a ver com Defesa Cibernética? Se ainda
não caiu a ficha, vou lhe dar uma ajudazinha...
import platform
print("Distribuição do Sistema Operacional.: ", platform.platform())
print("Nome do Sistema Operacional.........: ", platform.system())
print("Versão do Sistema Operacional.......: ", platform.release())
print("Arquitetura.........................: ", platform.architecture())
print("Nome do Computador..................: ", platform.node())
print("Tipo de Máquina.....................: ", platform.machine())
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
Esse código aponta que precisamos importar o pacote “platform” para obtermos
informações como:
• platform(): método que retorna a distribuição exata do sistema operacional
que está sendo executado. Muito útil para que possamos desenvolver
ferramentas de inventário ou ferramentas que podem servir para apontar
computadores que não estão atualizados.
• system(): este método retorna simplesmente o sistema operacional que está
sendo executado. Isso pode auxiliar sua ferramenta a executar, por
exemplo, comandos de Windows no Windows, e comandos do Linux no
Linux, tornando-a multiplataforma
release(): retorna a versão do sistema operacional que está sendo
executada.
• architecture(): exibe a arquitetura que está em uso pela máquina.
• node(): retorna o nome do computador na rede. Mais uma vez, essa é uma
informação muito importante para o inventário. Lembra quando nós fizemos
uma ferramenta em que o usuário deveria digitar? Pois é, podemos deixar
nossas ferramentas mais independentes do usuário e, consequentemente,
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
import getpass
from datetime import datetime
print("Usuário.......: ", getpass.getuser())
print("Data Completa.: ", datetime.now())
print("Dia...........: ", datetime.now().day)
print("Mês...........: ", datetime.now().month)
print("Ano...........: ", datetime.now().year)
print("Hora..........: ", datetime.now().hour)
print("Minuto........: ", datetime.now().minute)
print("Segundo.......: ", datetime.now().second)
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
Pandas
import pandas
• index: recebe uma string ou uma lista de strings que definem os rótulos das
linhas.
• columns: recebe uma string ou uma lista de strings que definem os rótulos
das colunas.
• dtype: recebe um tipo de dados com intuito de forçar a conversão do tipo
de dados do DataFrame. Por padrão esse parâmetro recebe valor None e os
tipos dos dados são inferidos.
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
• Note que o DataFrame criado possui as colunas com nomes indicados nas
chaves do dicionário.
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
import pandas as pd
print(df)
# Nome Idade
# A Ana 21
# B Bruno 20
# C Carla 22
print(df.ndim)
#2
print(df.shape)
# (3, 2)
print(df.size)
#6
print(df.empty)
# False
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
import pandas as pd
print(df)
# Nome Idade
# A Ana 21
# B Bruno 20
# C Carla 22
print(df.ndim)
#2
print(df.shape)
# (3, 2)
print(df.size)
#6
print(df.empty)
# False
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
import pandas as pd
dados = [('Ana', 21), ('Bruno', 20), ('Carla', 22)]
df = pd.DataFrame(data = dados)
print(df)
#01
# 0 Ana 21
# 1 Bruno 20
# 2 Carla 22
print(df[0][0], df[0][1], df[0][2])
# Ana Bruno Carla
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
import pandas as pd
print(df)
# Nome Idade
# A Ana 21
# B Bruno 20
# C Carla 22
print(df.T)
#ABC
# Nome Ana Bruno Carla
# Idade 21 20 22
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
import pandas as pd
print(df)
Nome Idade
# A Ana 21
# B Bruno 20
# C Carla 22
df.at['C', 'Nome']
# 'Carla'
df.at['C', 'Idade']
# 22
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
import pandas as pd
print(df)
# Nome Idade
# A Ana 21
# B Bruno 20
# C Carla 22
print(df.iat[0, 0])
# Ana
print(df.iat[0, 1])
# 21
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
import pandas as pd
print(df)
# Nome Idade
# A Ana 21
# B Bruno 20
# C Carla 22
print(df.loc[['A', 'C']])
# Nome Idade
# A Ana 21
# C Carla 22
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
Mais exemplos com o indexador loc.
import pandas as pd
print(df)
# Nome Idade
# A Ana 21
# B Bruno 20
# C Carla 22
print(df.loc[[True , False , True]])
# Nome Idade
# A Ana 21
# C Carla 22
print(df.loc[[True , False , True], 'Nome'])
# A Ana
# C Carla
# Name: Nome, dtype: object
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
O indexador iloc seleciona um conjunto de linhas e colunas baseado
unicamente em índices.
import pandas as pd
print(df)
# Nome Idade
# A Ana 21
# B Bruno 20
# C Carla 22
print(df.iloc[-1])
# Nome Carla
# Idade 22
# Name: C, dtype: object
print(df.iloc[[0,2],0])
# A Ana
# C Carla
# Name: Nome, dtype: object
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
Manipulação de Dados em um DataFrame
import pandas as pd
print(df1)
# Nome Idade Sexo
# A Ana 21 F
# B Bruno 20 M
dados = [ {'Nome': 'Carla', 'Idade': 22, 'Sexo': 'F'},
{'Nome': 'Daniel', 'Idade': 18, 'Sexo': 'M'} ]
df2 = df1.append(dados, ignore_index = True)
print(df2)
# Nome Idade Sexo
# 0 Ana 21 F
# 1 Bruno 20 M
# 2 Carla 22 F
# 3 Daniel 18 M
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
Os indexadores loc e iloc também podem ser utilizados para modificar uma
linha já existente.
• Para isso basta atribuir os novos valores desejados ou um valor padrão.
• O indexador loc também pode ser utilizado para adicionar uma nova linha
no final do DataFrame de forma similar.
import pandas as pd
print(df)
# Nome Idade Sexo
# A Ana 21 F
# B Bruno 20 M
df.loc['B'] = ['Bento', 22, 'M']
df.loc['C'] = ['Carla', 22, 'F']
df.loc['D'] = ['Daniela', 18, 'F']
print(df)
# Nome Idade Sexo
# A Ana 21 F
# B Bento 22 M
# C Carla 22 F
# D Daniela 18 F
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
Removendo Linhas e Colunas de um DataFrame
import pandas as pd
print(df)
# Nome Idade Sexo
# A Ana 17 F
# B Bruno 19 M
# C Carla 20 F
# D Daniel 18 M
df.drop(index = ['A', 'D'], columns = ['Sexo'],
inplace = True)
print(df)
# Nome Idade
# B Bruno 19
# C Carla 20
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
• A biblioteca pandas permite utilizar operadores lógicos e aritméticos em
colunas inteiras de um DataFrame.
• Alguns exemplos de operadores: • +, += • -, -= • *, *= • /, /= • ==, >=, <=, !=, >, <
import pandas as pd
print(df)
# Nome Idade Sexo
# A Ana 17 F
# B Bruno 19 M
#C Carla 20 F
# D Daniel 18 M
df['Idade'] += 1
print(df)
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
# Nome Idade Sexo
# A Ana 18 F
# B Bruno 20 M
# C Carla 21 F
# D Daniel 19 M
import pandas as pd
print(df)
Nome Idade Sexo
# A Ana 17 F
# B Bruno 19 M
# C Carla 20 F
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
# D Daniel 18 M
resultado = list(df['Idade'] >= 18)
print(resultado)
# [False , True, True, True]
import pandas as pd
print(df)
# Nome Idade Sexo
# A Ana 17 F
# B Bruno 19 M
# C Carla 20 F
# D Daniel 18 M
resultado = list(df['Idade'] >= 18)
print(df.loc[resultado])
# Nome Idade Sexo
# B Bruno 19 M
# C Carla 20 F
# D Daniel 18 M
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
• Um DataFrame pode ser ordenado utilizando o método sort_values.
• O método sort_values possui alguns parâmetros:
• by: string ou lista de strings especificando os rótulos que serão utilizados
como chave para a ordenação.
• axis: eixo de ordenação vertical (0, padrão) ou horizontal (1).
• ascending: ordenação crescente ou decrescente (padrão: True).
• kind: algoritmo de ordenação que será utilizado (padrão: quicksort).
• inplace: define se a ordenação deve ser aplicada diretamente no DataFrame
ou em uma cópia (padrão: False).
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
Exemplo de ordenação de um DataFrame.
import pandas as pd
print(df)
# Nome Idade Sexo
# A Ana 17 F
# B Bruno 19 M
# C Carla 20 F
# D Daniel 18 M
df.sort_values(by = 'Idade', ascending = False , inplace = True)
print(df)
# Nome Idade Sexo
# C Carla 20 F
# B Bruno 19 M
# D Daniel 18 M
# A Ana 17 F
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
• É possível também ordenar um DataFrame pelos seus rótulos utilizando o
método sort_index.
• O método sort_index possui alguns parâmetros:
• axis: eixo de ordenação vertical (0, padrão) ou horizontal (1).
• ascending: ordenação crescente ou decrescente (padrão: True).
• kind: algoritmo de ordenação que será utilizado (padrão: quicksort).
• inplace: define se a ordenação deve ser aplicada diretamente no DataFrame
ou em uma cópia (padrão: False).
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
Exemplo de ordenação de um DataFrame pelos rótulos das colunas.
import pandas as pd
print(df)
# Nome Idade Sexo
# A Ana 17 F
# B Bruno 19 M
# C Carla 20 F
# D Daniel 18 M
df.sort_index(axis = 1, inplace = True)
print(df)
# Idade Nome Sexo
# A 17 Ana F
# B 19 Bruno M
# C 20 Carla F
# D 18 Daniel M
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
A biblioteca pandas possui vários métodos para realização de cálculos em
colunas:
• abs: retorna uma lista com os valores absolutos da coluna.
• count: realiza a contagem de quantas células da coluna possuem valores
disponíveis.
• nunique: conta os valores distintos na coluna.
• sum: retorna a soma dos valores da coluna.
• max: retorna o maior valor da coluna.
• min: retorna o menor valor da coluna.
• mean: computa a média dos valores da coluna.
• median: calcula a mediana dos valores da coluna.
• copy: retorna uma cópia do DataFrame.
• head: retorna as n primeiras linhas do DataFrame (valor padrão: n = 5).
• tail: retorna as n últimas linhas do DataFrame (valor padrão: n = 5).
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
Exemplo de métodos aritméticos.
import pandas as pd
print(df)
# Nome Idade Sexo
# A Ana 17 F
# B Bruno 19 M
# C Carla 20 F
# D Daniel 18 M
print(df.Idade.count())
#4
print(df.Idade.sum())
# 74
print(df.Idade.max())
# 20
print(df.Idade.min())
# 17
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
print(df.Idade.mean())
# 18.5
print(df.Idade.median())
# 18.5
A biblioteca pandas fornece uma forma rápida e fácil para exportar os dados
de um DataFrame para diferentes formatos.
• Entre os diversos formatos disponíveis iremos focar no formato CSV
(Comma-Separated Values, ou Valores Separados por Vírgulas).
• Para realizar essa tarefa temos o método to_csv.
• Alguns dos parâmetros desse método são:
• path_or_buf: caminho ou buffer onde o arquivo deve ser salvo.
• sep: caractere separador do arquivo (o padrão é a vírgula).
• header: define se os rótulos das colunas devem ser inseridos no arquivo ou
não (padrão: True).
• index: define se os rótulos das linhas devem ser inseridos no arquivo ou não
(padrão: True).
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
• Exemplo de como exportar os dados de um DataFrame para um arquivo
CSV.
import pandas as pd
print(df)
# Nome Idade Sexo
# A Ana 17 F
# B Bruno 19 M
# C Carla 20 F
# D Daniel 18 M
df.to_csv('dados.csv')
BIBLIOTECAS EXTERNAS E SISTEMA OPERACIONAL
Para importar um arquivo CSV a biblioteca pandas fornece a função
read_csv.
• Alguns dos parâmetros desse método são:
• filepath_or_buffer: caminho ou buffer até o arquivo CSV.
• sep: caractere separador do arquivo (o padrão é a vírgula).
• names: lista de rótulos para serem utilizados nas colunas.
• header: linha do arquivo CSV para ser utilizada como rótulos para as
colunas.
• index_col: coluna do arquivo CSV para ser utilizada como rótulos para as
linhas
Com isso vimos cfomo trabalhar com DataFrames, conceito crucial para
trabalhar com análise de dados utilizando python.
PROTOCOLO DE COMUNICAÇÃO E PYTHON
Neste conteúdo, veremos como o Python pode se interligar com diversas áreas. Até o
momento no seu curso, foram apresentados os conceitos básicos da linguagem e um pouco
de aplicações externas, como, por exemplo, a utilização dos pacotes externos, como fizemos
com o Pygeocoder. A missão, a partir de agora, édemonstrar as várias áreas de atuação em
que poderemos utilizar Python.
Agora entenderemos como ele pode interagir com alguns protocolos, saberemos mais
adiante como ele será utilizado com IoT, um pouco mais à frente,também verificaremos a
ligação do Python com Inteligência Artificial e finalizaremos o conteúdo deste ano em Python
comunicando-se com Cybersecurity junto a ferramentas de pentest. Então, agora é abrir o seu
IDE e vamos codar.
import getpass
usuario = input("\nDigite o usuário: ").upper()
senha = getpass.getpass("Digite a senha: ")
if usuario == "BITMED" and senha == "FiAp1222":
print("Usuário logado")
else:
print("Login Negado")
PROTOCOLO DE COMUNICAÇÃO E PYTHON
Esse código é bem simples, estamos somente capturando um usuário e senha
e verificando se é o usuário (“BITMED”) com a senha válida (“FiAp1222”). Somente
se usuário e senha coincidirem, o usuário terá acesso e será logado. Mas observe
que, ao digitar a senha, essa será apresentada na tela enquanto o usuário digitar, ou
seja, nada seguro, não é mesmo? É aí que entra a outra função do “getpass”. Veja,
agora, o código alterado (digite-o em um novo arquivo chamado “Login.py”):
import getpass
usuario = input("\nDigite o usuário: ").upper()
senha = getpass.getpass("Digite a senha: ")
if usuario == "BITMED" and senha == "FiAp1222":
print("Usuário logado")
else:
print("Login Negado")
PROTOCOLO DE COMUNICAÇÃO E PYTHON
Caso você execute esse código dentro do PyCharm, verá que o comportamento
do sistema não está adequado (dependendo do seu sistema operacional). Você digita
o usuário, ele muda de linha e permanece solicitando o usuário, até que você encerre
o código manualmente. Isso ocorrerá porque a IDE (ou até mesmo o ambiente IDLE
do Python) não consegue utilizar o método getpass() para a emissão de caracteres.
Somente quando o código for executado fora da IDE é que ele irá funcionar
perfeitamente. Logo, teremos duas opções: a primeira seria você ir até o console do
seu sistema operacional, se deslocar até a pasta do seu arquivo e, então, compilar o
código-fonte; a outra, mais simples, é que podemos simular a execução no console
dentro do Python, para isso, observe a seguinte figura:
Clique sobre o botão “OK” e, em seguida, execute o seu código. Você verá, na
parte inferior, que o seu código será executado como se estivesse sendo compilado
no console do seu sistema operacional. Agora, no momento da digitação, ele não só
PROTOCOLO DE COMUNICAÇÃO E PYTHON
Você deve estar se perguntando: por que preciso importar essa biblioteca?
Qual a sua finalidade? Pois bem, essa é a biblioteca que será responsável por criar ferramentas
e estabelecer comunicação entre dois processos, ou mais, que podem estar em uma rede de
computadores. Por isso, vamos relembrar os principais protocolos envolvidos em uma
transmissão de dados entre computadores:
• IP: que representa o endereço do qual partiu ou para o qual irá determinado pacote de
dados, ou seja, o endereçamento lógico;
• TCP: protocolo de transporte que possui maior confiabilidade na entrega dos pacotes, devido
ao processo de “handshake” que ele realiza; e
UDP: protocolo de transporte que possui maior velocidade, porém menor confiabilidade de
entrega (quando comparado ao TCP), uma vez que ele não realiza “handshake”.
Claro que essas definições apenas pretendem relembrar os conceitos básicos desses
protocolos. Vejamos um primeiro exemplo para recuperarmos o endereço IP por meio do
DNS:
• Crie um novo diretório chamado: Capitulo7_Socket, dentro dele, crie um arquivo do tipo
“Python File”, chamado: Socket.py, e digite o seguinte código:
PROTOCOLO DE COMUNICAÇÃO E PYTHON
import socket
resp="S"
while(resp=="S"):
url=input("Digite uma url: ")
ip=socket.gethostbyname(url)
print("O IP referente à url informada é: ", ip)
resp=input("Digite <s> para continuar: ").upper()
Simples, não é mesmo? Mas até o momento vimos o socket somente agindo
junto ao protocolo IP, que, por sua vez, ainda necessita de uma porta para que
pacotes possam ser direcionados de maneira íntegra e correta.
Podemos identificar as portas da nossa máquina que estão sendo utilizadas
para serviços, como domínio, http e ftp, por exemplo. Crie um novo arquivo “Python
File” com o nome “Portas.py” e digite o código a seguir:
import socket
print(socket.getservbyname("domain"))
print(socket.getservbyname("http"))
print(socket.getservbyname("ftp"))
PROTOCOLO DE COMUNICAÇÃO E PYTHON
Com a execução desse código, teremos o retorno das portas que estamos
disponibilizando para: domínio (por padrão 53), usado para resolver a conversão
entre DNS e IP; HTTP (por padrão 80), usado para navegar nas páginas WEB; e
FTP (por padrão 21), usado para transferência de arquivos.
Preparação do servidor
Vamos preparar duas ferramentas, uma será utilizada para ficar no servidor,
isso significa que será a ferramenta que ficará escutando e atendendo aos pedidos
dos clientes. A segunda ferramenta deverá ficar nos clientes, ou seja, é a ferramenta
que irá fazer as solicitações para o servidor.
Todos os dados transmitidos via socket devem estar no formato byte. O socket
não envia nem recebe dados strings, por exemplo.
PROTOCOLO DE COMUNICAÇÃO E PYTHON
Na próxima linha, fazemos a associação no nosso objeto socket com o nosso servidor e porta.
• Na linha em que utilizamos a função “listen()”, estamos definindo o máximo de clientes que o
nosso servidor irá atender simultaneamente, para o nosso caso, definimos que serão, no máximo,
dois (2) clientes.
• Montamos, na sequência, dois laços infinitos (enquanto for verdadeiro): no primeiro,
aguardamos a chamada de um cliente (por meio da função accept()), assim que tivermos,
receberemos uma tupla e iremos direcionar a identificação do cliente para a variável “cliente” e a
identificação da conexão para a variável “con” e, então, iremos exibir a identificação do
nosso cliente;
• No segundo laço, aguardando uma solicitação que pode ser transmitida
em pacotes de 1024 bytes, exibimos a mensagem recebida e geramos uma mensagem para
enviar no formato de “bytes” (por isso, a mensagem começa com “b” e, em seguida, a string que se
deseja), enviamos por meio do método “send()” e encerramos esse segundo laço while.
• Finalmente, fechamos a conexão e voltamos a aguardar uma nova conexão.
Todos os dados transmitidos via socket devem estar no formato byte. O socket
não envia nem recebe dados strings, por exemplo.
PROTOCOLO DE COMUNICAÇÃO E PYTHON
Preparação do cliente
• As três próximas linhas são referentes à criação do objeto socket (por meio da função
“socket()”), à conexão com o servidor, por meio da função “connect()”, e, finalmente, enviando
uma mensagem para o servidor, utilizando o método “send()”.
A variável resposta recebe o dado enviado pelo servidor, limitando o tamanho para 1024 bytes.
Chat Python
O bot pode fazer uma análise sobre as palavras recebidas, então, realizar
algum processamento e responder de acordo com a análise/processamento dos dados que
foram recebidos, ajudando, de maneira automática, todos os clientes que
estiverem na rede. Essa ideia pode ser ainda mais aprimorada e, por exemplo, fazer
com que o servidor esteja conectado a um banco de dados que armazenará
PROTOCOLO DE COMUNICAÇÃO E PYTHON
O mundo não é feito só de sockets
Na primeira linha, fizemos a importação de todas as funções do módulo ftplib, como, por
exemplo, a função FTP(), que permite criar um objeto que representará a conexão
estabelecida.
Na segunda linha, criamos uma variável booleana, ou seja, armazenará somente os valores
“True” ou “False” (cuidado, pois no Python, os valores “True” e “False” devem ser digitados
com a primeira letra maiúscula, diferente dos padrões adotados em outras linguagens).
Essa variável está definida como False, e a utilizaremos posteriormente, para definirmos se
a conexão será ativa ou passiva.
PROTOCOLO DE COMUNICAÇÃO E PYTHON
A conexão ativa era mais utilizada quando a Internet ainda não era tão difundida, pois
permitia que o servidor criasse uma conexão diretamente com o cliente, entretanto, os
clientes passaram a ter firewalls e outros tipos de proteções, o que passou a impedir esse
tipo de solicitação. Então, a utilização da conexão passiva passou a ser mais comum,
representando que o servidor irá liberar uma porta e solicitará o estabelecimento da
conexão para o cliente, por isso, a variável está com o valor False, que representa a conexão
passiva.
Na terceira linha, criamos um objeto para representar uma conexão FTP, para isso,
utilizamos o método “FTP()”, que precisa apenas do endereço do servidor FTP, no exemplo,
utilizamos o endereço “ftp.ibiblio.org”. Caso queira, pode acessá-lo diretamente em seu
browser, por meio do endereço “ftp://ftp.ibiblio.org/”, irá surgir uma imagem como a que
será apresentada logo a seguir.
Na quarta linha, chamamos o método “getwelcome()” do objeto “ftp”, que irá apresentar
uma mensagem-padrão retornada pelo servidor. Essa mensagem pode, por exemplo, ser
útil para informar ao cliente que algum arquivo está indisponível, ou que o servidor está
passando por uma atualização, ou simplesmente ser responsável por um “olá”.
PROTOCOLO DE COMUNICAÇÃO E PYTHON
Na última linha, encerramos a conexão.
Este servidor “ibiblio” é público (uma biblioteca pública para compartilhamento
de arquivos digitais) e permite acesso aos seus arquivos de maneira livre. Perceba
que, por intermédio do browser, você pode navegar entre os diretórios,
provavelmente não irá encontrar nada de muito interessante entre os diretórios, e
também baixar os arquivos, algo que iremos fazer por meio do Python para que você
possa automatizar essa ação utilizando uma ferramenta.
import os
from ftplib import *
ftp_ativo=False
ftp = FTP(input("Digite o FTP que se deseja conectar: "))
print(ftp.getwelcome())
usuario=input("Digite o usuario: ")
senha=input("Digite a senha: ")
ftp.login(usuario, senha)
print("Conexão bem sucedida.\nDiretório atual de trabalho: ", ftp.pwd(),"\n\n")
menu="1"
PROTOCOLO DE COMUNICAÇÃO E PYTHON
while menu=="1" or menu=="2" or menu=="3":
menu=input("Escolha a opção desejada: "
"\n<1> - para Listar arquivos"
"\n<2> - para definir um diretório"
"\n<3> - para baixar um arquivo: ")
if menu=="1":
print(ftp.dir())
elif menu=="2":
ftp.cwd(input("Digite o diretório que deseja entrar: "))
print("\nDiretório corrente é: ", ftp.pwd())
elif menu=="3":
tipo=input("Digite <B> para arquivo binário ou "
"\nqualquer outra letra para arquivo ASCII: ").upper()
if tipo=="B":
with open(input("Digite o nome do arquivo destino: "), 'wb') as arq:
ftp.retrbinary('RETR ' + input("Arquivo de origem: "), arq.write)
else:
with open(input("Digite o nome do arquivo destino: "), 'w') as arq:
PROTOCOLO DE COMUNICAÇÃO E PYTHON
while menu=="1" or menu=="2" or menu=="3":
menu=input("Escolha a opção desejada: "
"\n<1> - para Listar arquivos"
"\n<2> - para definir um diretório"
"\n<3> - para baixar um arquivo: ")
if menu=="1":
print(ftp.dir())
elif menu=="2":
ftp.cwd(input("Digite o diretório que deseja entrar: "))
print("\nDiretório corrente é: ", ftp.pwd())
elif menu=="3":
tipo=input("Digite <B> para arquivo binário ou "
"\nqualquer outra letra para arquivo ASCII: ").upper()
if tipo=="B":
with open(input("Digite o nome do arquivo destino: "), 'wb') as arq:
ftp.retrbinary('RETR ' + input("Arquivo de origem: "), arq.write)
else:
with open(input("Digite o nome do arquivo destino: "), 'w') as arq:
PROTOCOLO DE COMUNICAÇÃO E PYTHON
Linhas 10, 11, 12, 13, 14 e 15: criamos uma variável “menu” para que o
usuário escolha uma das opções desejadas, enquanto o usuário digitar
algo igual a 1, 2 ou 3, o laço será repetido e o usuário perguntado
novamente sobre qual ação deseja realizar.
• Linhas 16 e 17: se o usuário digitar o número “1”, iremos exibir uma
listagem do diretório atual, exibindo arquivos e diretórios; após a exibição,
irá voltar para o menu.
• Linhas 18, 19 e 20: se o usuário digitar o número “2”, iremos mudar de
diretório de acordo com o que o usuário digitar. Seguindo o nosso
exemplo, digite: “seculoxx”, em seguida, será exibido o diretório atual e
voltará ao menu, utilize novamente a opção “1” para exibir o conteúdo do
diretório “seculoxx”.
• Linhas 21, 22 e 23: se o usuário digitar o número “3”, iremos perguntar o
que ele deseja baixar. Se for um arquivo binário, ele deverá digitar a letra
“b”. Qualquer outro caractere irá considerar o que ele deseja baixar como
ASCII. Seguindo o nosso exemplo, digite “B”.
PROTOCOLO DE COMUNICAÇÃO E PYTHON
Linhas 24, 25 e 26: nesse caso, se o usuário digitou “B”, iremos pedir o
nome do arquivo destino. Diante do nosso exemplo, digite “zipado.zip” (o
nome do arquivo deve ser completo, inclusive, com a extensão), em
seguida, ele pedirá o arquivo de origem; seguindo o nosso exemplo,
escolheremos o arquivo “representacao_politica.zip” (o nome do arquivo
deve ser completo, inclusive, com a extensão). Cuidado que o nome do
arquivo deve ser exatamente igual ao que está aparecendo na listagem.
Aguarde até surgir a mensagem “Arquivo baixado com sucesso” e, então,
aparecerá o menu novamente. Escolha a opção “3” para baixar um arquivo
e, na próxima pergunta, digite qualquer letra diferente de “B”, pois iremos
baixar um arquivo “ASCII”.
• Linhas 27 e 28: se o usuário digitar qualquer letra diferente de “B”,
representa que deseja baixar um arquivo “ASCII”. Ele solicitará o nome do
arquivo de destino; seguindo o nosso exemplo, digite: “textobaixado.txt”
(inclusive com a extensão).
• Linhas 29, 30 e 31: criamos a função para realizar a leitura das linhas e a
identificação do sistema operacional em relação ao separador de linha
utilizado dentro do arquivo.
PROTOCOLO DE COMUNICAÇÃO E PYTHON
Linha 32: irá solicitar o nome do arquivo de origem. Seguindo o nosso
exemplo, digite o arquivo “leia_me.txt”, exatamente igual. E então, o “arq”
será escrito com base no “leia_me.txt”.
• Linha 33: exibimos a mensagem de que o arquivo foi baixado (CUIDADO
com a tabulação dessa linha) e voltaremos para o menu.
• Linha 34: somente será executada se o usuário digitar algo diferente de
“1”, “2” ou “3”, o que encerrará a conexão.
Se você seguiu os nossos passos, durante a explicação das linhas, deverá
ter, no mesmo diretório do arquivo “FTP_Interativo.py”, os arquivos: “zipado.zip” e
“textobaixado.txt”. Nele, poderá exibi-los ou descompactá-los, no caso do arquivo
compactado. Assim, o seu usuário poderá interagir em qualquer servidor FTP,
navegar entre os diretórios e baixar arquivos ASCII ou binários.
Se for Windows:
pip install pyserial
Se for Linux:
apt-get install python-serial
Python & IOT
As portas de entradas e saídas, tanto analógicas quanto digitais, servirão para
conectarmos os sensores e/ou atuadores, e as portas para alimentação serão utilizadas
para enviar energia para o funcionamento dos sensores e/ou atuadores
import serial
conexao = serial.Serial('COM3', 115200, timeout=0.5)
O erro acima representa que a porta “COM3” não está disponível. Esse erro
somente não será apresentado para você, caso já esteja com o Arduino conectado
no seu computador e também se o Arduino estiver conectado na porta COM3. E
quando não sabemos exatamente em qual porta o nosso dispositivo está
conectado? Poderíamos abrir o Arduino Sketch e verificar atrás dele, mas essa ação
ficaria pouco prática. Podemos fazer isso dentro do nosso próprio código Python,
acrescentando as seguintes linhas:
Python & IOT
import serial
conexao=""
for porta in range(10):
try:
conexao = serial.Serial("COM"+str(porta), 115200, timeout=0.5)
print("Conectado na porta: ", conexao.portstr)
break
except serial.SerialException:
pass
if conexao!="":
conexao.close()
print("Conexão encerrada")
else:
print("Sem portas disponíveis")
Python & IOT
Esse código está próprio para Windows, caso utilize Linux deverá alterar a
linha:
• conexao = serial.Serial("COM"+str(porta), 115200,
timeout=0.5)
Por:
• conexao = serial.Serial("/dev/ttyUSB"+str(porta),
115200)
• Nas linhas 1 e 2: estamos importando a classe serial e criando uma variável “conexão” sem
qualquer conteúdo do tipo string.
• Na linha 3: abrimos um for que irá caracterizar um laço de repetição de 0 a 10. Esse
número irá representar a porta à qual o Arduino estará conectado. Se o seu Arduino estiver
na porta 11, ela não será encontrada por esse for, você deverá aumentar o número de
repetições do laço, entretanto, dificilmente seu dispositivo estará em uma porta serial
maior que 9.
• Na linha 4: abrimos um bloco “try”, que sempre virá acompanhado de um bloco “except”.
Dentro do “try”, colocamos as linhas que eventualmente podem disparar uma exceção. O
que é uma exceção? É um evento que o programador não consegue controlar, por
exemplo, não consigo controlar,quando esse código for executado, se o usuário irá ter
conectado o Arduino ou não. E, conforme fizemos anteriormente, no primeiro teste com
a saída serial, caso o Arduino não esteja conectado, será exibida uma mensagem de erro e
o programa será abortado. Não desejamos que isso ocorra, se a porta não estiver
disponível, quero que ele procure na próxima e assim sucessivamente, até a porta “9” e,
caso não encontre qualquer porta ativa, que simplesmente dê uma mensagem para o
usuário e não aborte o sistema
Python & IOT
•Por isso, colocamos as linhas 5, 6 e 7 dentro do “try”, indicando que, se houver qualquer
exceção, ou seja, se a linha 5 não conseguir estabelecer conexão com a saída serial, o
código irá pular para a linha “8”. Então, executará a linha “9” (que está dentro do bloco
except) e irá ignorar a exceção (comando “pass”), como consequência, não abortará
o sistema e permanecerá no laço executando o sistema normalmente.
• Linha 5: linha que tenta estabelecer a conexão com a porta serial, de acordo com o valor
que estiver valendo para o laço (valor da variável “porta” que irá variar entre 0 e 9). Se a
conexão for estabelecida com sucesso, passará para a linha 6, caso dê a exceção, ou seja,
se não conseguir conexão, irá direto para a linha 8 (bloco except), que executará
a linha 9 e, então, irá ignorar a exceção e continuar a execução do laço.
• Linha 6: somente será executada se a linha anterior ocorrer com sucesso, então, irá
mostrar para o usuário o nome da porta que conseguiu conectar, por meio do valor
“conexao.portstr”, que retorna a porta no formato string.
• Linha 7: irá abandonar o laço, uma vez que a conexão já foi estabelecida com sucesso.
• Linha 8: somente será executada se a conexão não for bem-sucedida e lançar uma
exceção do tipo “serial.SerialException”, ou seja, a conexão não ocorreu.
Standup da Equipe Indústrias
Willifred
As reuniões colaborativas são as melhores! Clique em “Compartilhar”, adicione seus colegas e comece a interagir.
Python & IOT
Linha 9: esta linha faz com que o sistema não seja abortado, caso ocorra
a exceção “serial.SerialException”.
• Linhas 10, 11 e 12: se o conteúdo da variável não for vazio (significa que uma conexão
ocorreu com sucesso), irá fechar a conexão e exibir a mensagem “Conexao encerrada”.
Agora que a estrutura está pronta, vamos desenvolver o código que o nosso
Arduino deverá receber, abra o “Arduino Sketch” e digite o código como apresentado
na imagem:
Python & IOT
import serial
conexao=""
for porta in range(10):
try:
conexao = serial.Serial("COM"+str(porta), 115200, timeout=0.5)
print("Conectado na porta: ", conexao.portstr)
break
except serial.SerialException:
pass
Python & IOT
if conexao!="":
acao=input("Digite:\n<L> para Ligar\n<D> para Desligar: ").upper()
while acao=="L" or acao=="D":
if acao=="L":
conexao.write(b'1')
else:
conexao.write(b'0')
acao = input("Digite:\n<L> para Ligar\n<D> para Desligar: ").upper()
conexao.close()
print("Conexao encerrada")
else:
print("Sem portas disponíveis")
Python & IOT
void setup()
{
pinMode(10, OUTPUT);
Serial.begin(115200);
}
void loop() {
int intervalo_pisca;
intervalo_pisca=4000;
digitalWrite(10, LOW);
Serial.write('0');
delay(intervalo_pisca);
digitalWrite(10, HIGH);
Serial.write('1');
delay(intervalo_pisca);
}
Python & IOT
Nas duas primeiras linhas, criamos uma variável para controlar o intervalo
de tempo entre ligar e desligar o led. A unidade de medida utilizada é em
milissegundos, por isso, com 4000 estamos representando de quatro em
quatro segundos.
• Na terceira linha, desligamos o nosso led.
• Na quarta linha, escrevemos na porta serial o valor “0”, por meio da função
“write()”.
• Na quinta linha, chamamos a função “delay()” e passamos para ela o valor
dado ao intervalo que está dentro da variável “intervalo_pisca”.
• Nas três últimas linhas, ligamos o led, escrevemos na saída serial o valor
“1” e ativamos a espera.
Verifique se digitou tudo corretamente e transfira para o seu Arduino
Python & IOT
import serial
conexao=""
for porta in range(10):
try:
conexao = serial.Serial("COM"+str(porta), 115200)
print("Conectado na porta: ", conexao.portstr)
break
except serial.SerialException:
pass
Python & IOT
if conexao!="":
while True:
resposta = conexao.read()
if resposta==b'1':
print("LED Ligado")
else:
print("LED Desligado")
conexao.close()
print("Conexão encerrada")
else:
print("Sem portas disponíveis")
Python & IOT
Agora, vamos montar mais um exemplo no qual a nossa aplicação Python irá
receber os dados e gravá-los fisicamente em um arquivo “json”. Para isso, vamos
utilizar um sensor de luminosidade LDR (Light Dependent Resistor) que funciona
variando sua resistência elétrica por meio da luminosidade recebida. Isso significa
que quanto mais luz, menor a resistência elétrica e vice-versa. Precisaremos, para o
desenvolvimento desse exemplo, de: um sensor de luminosidade LDR, uma
protoboard, um resistor (marrom, preto, laranja), três cabos machos e a nossa placa
Arduino.
Agora que a ligação está pronta, conecte a sua placa Arduino ao seu
computador e, no Arduino Sketch, digite o seguinte código:
Python & IOT
void setup() {
Serial.begin(115200);
}
void loop() {
int luz=analogRead(1);
Serial.println(luz);
delay(5000);
}
Em seguida, iremos transmitir para a saída Serial o valor que foi retornado
pelo sensor. Detalhe para a utilização do método “println()” e não o “write()”, devido
ao retorno do dado ser dinâmico em relação ao seu tamanho, ou seja, não
conseguimos precisar a quantidade de caracteres que será retornada pelo sensor.
Assim, utilizaremos “println()”, que é um método mais flexível, e, por fim,
acrescentaremos um tempo de 5 segundos para a próxima captura. Compile e, em
caso de sucesso, transmita o código para a sua placa Arduino.
Agora, vamos para o PyCharm. Crie um novo arquivo do tipo “Python File”,
denominado “Capturar_Temperatura.py”, no qual irá digitar o seguinte código
Python & IOT
import serial
conexao=""
for porta in range(10):
try:
conexao = serial.Serial("COM"+str(porta), 115200)
print("Conectado na porta: ", conexao.portstr)
break
except serial.SerialException:
pass
if conexao!="":
while True:
resposta = conexao.readline()
print(resposta.decode())
conexao.close()
print("Conexão encerrada")
else:
print("Sem portas disponíveis")
Python & IOT
Agora, basta executar a sua aplicação Python. Você verá algum número
provavelmente entre “100 e 999”, quanto menor, menos luminosidade, e vice-versa.
Procure colocar o seu dedo sobre o sensor e observe a alteração do valor que será
exibida. Procure também posicionar a lanterna do celular sobre o sensor e verá que
o número irá aumentar. Agora, iremos realizar uma pequena alteração para que
possamos armazenar os dados em um arquivo, posteriormente. Poderíamos utilizá-
los para realizar médias, montar relatórios com histórico, entre tantas outras ações
com esses dados. Dentro do código anterior, realize as seguintes alterações:
import serial
import json
import time
from datetime import datetime
conexao=""
for porta in range(10):
try:
conexao = serial.Serial("COM"+str(porta), 115200)
print("Conectado na porta: ", conexao.portstr)
Python & IOT
if conexao!="":
dicionario={}
cont=0
while cont<10:
resposta=conexao.readline()
dicionario[str(datetime.now())]=[resposta.decode('utf-8')[0:3]]
print(resposta.decode('utf-8')[0:3])
cont+=1
with open('Temperatura.json', "w") as arq:
json.dump(dicionario, arq)
conexao.close()
print("Conexão encerrada")
else:
print("Sem portas disponíveis")
Python & IOT
if conexao!="":
dicionario={}
cont=0
while cont<10:
resposta=conexao.readline()
dicionario[str(datetime.now())]=[resposta.decode('utf-8')[0:3]]
print(resposta.decode('utf-8')[0:3])
cont+=1
with open('Temperatura.json', "w") as arq:
json.dump(dicionario, arq)
conexao.close()
print("Conexão encerrada")
else:
print("Sem portas disponíveis")
Python & IOT
Agora, cabe a você, com toda a sua criatividade, utilizar diversos sensores
para que possa desenvolver soluções aplicadas para a sua área de atuação
profissional. Por exemplo, você pode desenvolver uma solução que ficará
responsável por verificar a resposta de um IP responsável por algum serviço dentro
da rede, e assim que ele não responder, o seu componente IoT pode disparar uma
sirene, gerar um log, piscar uma luz ou passar um sinal para um aplicativo no
smartphone ou qualquer outra forma de aviso de que o serviço saiu do ar.