Python

Python é uma linguagem de programação orientada a objetos lançada em 1991. Prioriza a legibilidade do código sobre a velocidade ou expressividade, combinando uma sintaxe concisa e clara com os recursos poderosos de sua biblioteca padrão e por módulos e frameworks desenvolvidos por terceiros. O nome Python teve a sua origem no grupo humorístico britânico Monty Python.

python

Para a separação de blocos de código, a linguagem usa espaços em branco e indentação ao invés de delimitadores visuais como chaves ou palavras. Ou seja, a indentação é obrigatória: o aumento da indentação indica o início de um novo bloco, que termina da diminuição da indentação. Um bloco inicia quando uma linha é indentada em 4 espaços - um bloco dentro de outro bloco, possui mais 4 espaços a frente, e assim por diante.

Utilizando o interpretador interativo não é necessário a criação do arquivo de Python compilado, os comandos são executados interativamente. Porém quando um programa ou um módulo é evocado, o interpretador realiza a análise léxica e sintática, compila o código de alto nível se necessário e o executa na máquina virtual da linguagem. O interpretador Python é um programa dinâmico que passa continuamente por mudanças e desenvolvimento, portanto o script pode rodar em uma versão mas não em outra - veja a versão instalado no seu PC através do comando "python -V" no bash.

No Python, a tipagem dos dados e objetos é dinâmica, ou seja, ao uma nova variável, ou um parâmetro de uma função, não é preciso informar qual é o seu tipo, nem mesmo defini-la antes de usá-la. Internamente todo valor é baseado em algum tipo de dado, que por sua vez é uma classe. Uma vez que um valor é atribuído a uma variável, ela passa a se comportar da forma que a classe daquele valor foi definida para se comportar.

Instalação

Sua instalação pode ser via apt-get:

$ sudo apt-get install python

Para instalar os módulos, utilize "sudo apt-get install python-MÓDULO" se tiver no repositório do Debian/Ubuntu - aparece o erro "ImportError: No module named ..." quando não tem o módulo. Observação: para instalar módulo para o python versão 2.xx, basta escrever "python", mas se for usar outra versão (3, 3.4, etc), deve-se colocar seu respectivo número após o nome do binário (python3, python3.4, etc) - o mesmo vale quando for executar um script python ou chamar o terminal.

Uma alternativa para instalar módulos é usar o comando pip, que busca os pacotes no repositório PyPI da Python Software Foundation. Essa opção abrange um número maior de módulos e permite escolher a versão. Além disso, ela é compilada no seu computador (os repositórios Linux usando versões pré-copmpiladas). Primeiro, instale o pip através dos seguintes comandos:

# Python -V < 3
sudo apt-get install python-pip
# Python -V >= 3
sudo apt-get install python3-pip

# Para versões mais antigas de Linux
# Python -V < 3
sudo apt-get install python-setuptools
sudo easy_install pip
# Python -V >= 3
sudo apt-get install python3-setuptools
sudo easy_install3 pip

Depois, basta instalar o módulo usando "sudo pip install MÓDULO" (ou pip3).

Utilização

Para usar o modo interativo (console), digite "python" e vai aparecer o prompt de comando como ">>>". Para sair, use "exit()".

Os arquivos de código-fonte são identificados por ".py" e executados como "python nome_script.py". Comentários começam com # e são terminados pela quebra da linha.

Sentenças não são funções (observe que não possuem parênteses em seguida); if, while e break são exemplos de sentenças de controle de fluxo, pois elas estabelecem quais instruções são executadas - a linha que as contém sempre termina com dois pontos ":". Enquanto o Python possui muitas funções, algumas delas existem em programas separados, chamados módulos. Nas primeiras linhas de código, deve começar importando os módulos. Para utilizá-los, escreva "import nome_do_módulo". Esta é uma sentença de importação. Veja um exemplo:

>>> from datetime import date
>>> hoje = date.today()
>>> hoje
datetime.date(2008, 11, 24)
>>> hoje.__class__
<type 'datetime.date'>

Nesse caso, para trabalhar com datas, é preciso importar um pacote chamado "date", de dentro de outro pacote, chamado "datetime". A função "today()" retorna a data do dia no formato "datetime.date" (o que pode ser visto na linha seguinte).

Alguns exemplos de funções: print() mostra um texto na tela; input() armazena um texto dado como entrada, pelo teclado; os.system() executa um comando shell; sys.exit("Error message") pára a execução e imprime mensagem (precisa do módulo sys). Para receber argumentos através da linha de comando, utilize a seguinte sintaxe (como é recebido uma lista, o segundo par de colchetes serve para selecionar o primeiro elemento):

data = sys.argv[1:][0]

O sys.argv[0] é o nome do próprio arquivo.

Manipulação de arquivos

Para manipular arquivos em Python, utiliza-se a função open com a seguinte sintaxe: variavel = open("file", "modo"). O modo pode ser leitura "r" (read) ou escrita "w" (write). Caso não exista o arquivo, ele é criado. "var_file" é um objeto, que pode ser acessado pelos seguintes métodos:

  • read(): retorna uma string única com todo o conteúdo do arquivo;
  • readline(): retorna a próxima linha do arquivo, e incrementa a posição atual;
  • readlines(): retorna todo o conteúdo do arquivo em uma lista, uma linha do arquivo por elemento da lista;
  • write(data): escreve a string data para o arquivo, na posição atual ou ao final do arquivo, dependendo do modo de abertura - esta função falha se o arquivo foi aberto com modo "r";
  • seek(n): muda a posição atual do arquivo para o valor indicado em n;
  • close(): fecha o arquivo - sempre utilizado no final da manipulação do arquivo.

Veja esses dois exemplos para ler/escrever um arquivo de texto de múltiplas linhas:

texto = '''1a linha
2a linha
3a linha
'''

# Leitura
with open('arquivo.txt', 'r') as f:
	for linha in f.readlines():
		print(linha)

# Outra forma de leitura
with open('arquivo.txt', 'r') as f:
	conteudo = f.read().splitlines()
	print(conteudo)

# Escrita
with open('arquivo.txt', 'w') as f:
	f.write(texto)

# Outra forma de escrita
f = open ('arquivo.txt', 'w')
f.write(texto)
f.close()

Obs: se for imprimir um número, utilize "str(número)" para convertê-lo em texto.

Banco de dados

Os métodos, que também são definidos para programação orientada a objetos, são funções dentro de uma classe. Um exemplo de objeto, responsável por enviar comandos ao banco de dados, é o "cursor". Dentre as operações desse objeto está o execute (executa comando no banco de dados) e fetchall (retorna todos os valores produzidos pelo comando executado).

Ao utilizar a operação "fetchall", será retornada uma tupla (ou "tuple"), que é como uma lista, só que imutável (ou seja, não dá para aplicar um "sort", por exemplo) - veja mais no post sobre Orientação a objeto no python e IDL. Ela é escrita entre parênteses e pode receber dados de datetime, string e inteiro conjuntamente, por exemplo:

import psycopg2
from datetime import datetime

conn = psycopg2.connect(host = "HOST", database = "DBNAME", user="USER")
cursor = conn.cursor()
query = "SELECT * FROM schema.table WHERE id = '1';"
cursor.execute(query)
temp = cursor.fetchall()
# print temp retorna: [(1, datetime.date(2015, 2, 6), datetime.date(2015, 7, 1), 90.9189)]
>> print str(temp[0][1])
# retorna: 2015-02-06

Para identificar um elemento nela, deve-se usar duas vezes a identificação de posição. Nesse exemplo, o comando "str(temp[0][1])" escolhe a posição 0 dentro da tupla (que só tem uma posição mesmo) e posição 1 com o elemento "datetime" (o comando "str()" é opcional, serve para imprimir a datetime no formato "2015-02-06").

Exemplo

Esse script importa alguns módulos necessário, define duas funções e um vetor, monta uma string com data e, dentro de um laço, varre todas as opções de locais para o ano e mês definido. Também faz uma verificação se o conteúdo é o suficiente para ser considerado válido e imprime a saída (que pode ser direcionada para um arquivo ao executar o script via linha de comando, por exemplo "python get_obs.py >> obs.csv"). A linha "coding" logo no início indica que o script usa a codificação informada (necessária para digitar acentos e caracteres especiais, por exemplo).

#!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import os
import sys
import urllib
from bs4 import BeautifulSoup
from datetime import date, timedelta
import psycopg2

# Funcao para converter mes em numero
def month2Num(m):

	if m == 'Jan':
		return '01'
	elif m == 'Fev':
		return '02'
	elif m  == 'Mar':
		return '03'
	elif m == 'Abr':
		return '04'
	elif m == 'Mai':
		return '05'
	elif m == 'Jun':
		return '06'
	elif m == 'Jul':
		return '07'
	elif m == 'Ago':
		return '08'
	elif m == 'Set':
		return '09'
	elif m == 'Out':
		return '10'
	elif m == 'Nov':
		return '11'
	elif m == 'Dez':
		return '12'

# Funcao para converter regiao em numero
def regiao2num(n):

	if n == 'CO':
		return '0'
	if n == 'SE':
		return '1'
	elif n == 'S':
		return '2'
	if n == 'NE':
		return '3'
	if n == 'N':
		return '4'

tipos = {

	'regiao': ['CO','SE', 'S', 'NE', 'N']
}

today = date.today()
first = date(day=1, month=today.month, year=today.year)
lastMonth = first - timedelta(days=1)
data_anterior = lastMonth.strftime("%Y-%m")

ano, mes_passado = data_anterior.split('-')

url = 'http://www.site.com.br/path'

for tipo, locais in tipos.iteritems():

	for local in locais:

			params = urllib.urlencode({ 

						'passo1': local,
						'passo2a':'-1',
						'passo2b':'var1',
						'passo3a':'-1',
						'passo3b':ano,
						'tipo': tipo,
						'passo2': 'var1',
						'passo3':ano,
						'passo4':-1,
						'passo1text': local,
						'passo2text': 'var1',
						'passo3text':ano,
						'passo4text': '-1',
					 })

			f = urllib.urlopen(url, params)
			html = BeautifulSoup(f)
			td = html.find_all('td')

			i = 3
			dados = {}

			if len(td) < 10:
				print local+' esta sem dados'
				continue

			while(i != len(td)):

				mes = str(td[i].string).strip()
				dado = str(td[i + 1].string).strip().replace(",", ".")

				#Dado do mes passado
				if month2Num(mes) == mes_passado and int(float(dado)) != 0:

					print regiao2num(local)+","+ano+"-"+month2Num(mes)+"-01,"+dado

				i += 2

			f.close()

Observação: O uso de "reload(sys)" e "sys.setdefaultencoding()" sempre foi desencorajado. Para usar codificação UTF-8, utilizar conforme consta no início do script de exemplo ("# -*- coding: utf-8 -*-" seguido de "from __future__ import unicode_literals").

Fontes

Compartilhe o link desse texto, mas se for copiar algum trecho, cite a fonte. Valorize nosso trabalho.
Mais informações na licença de uso do site.

4 Pingbacks/Trackbacks