Tutorial python

De Wikipast
Version datée du 20 février 2017 à 10:18 par Vbuntinx (discussion | contributions) (Page créée avec « ==Info== Ceci est une introduction simple au language python en vue de programer un bot Wikipast. Ce tutoriel sera mis à jour au fur et à mesure du cours pour facilite... »)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à la navigation Aller à la recherche

Info

Ceci est une introduction simple au language python en vue de programer un bot Wikipast.

Ce tutoriel sera mis à jour au fur et à mesure du cours pour faciliter les exercices.

Code

# -*- coding: utf-8 -*-
# Cette première ligne indique que le codage de charactères de ce code est utf-8, celà n'est pas
# nécessaire mais c'est particulièrement utile quand on travaille avec des données textuelles.


##################################################
#### 1. Commentaires et chaine de charactères ####
##################################################

# Un commentaire est une ligne de code commençant par le charactère "#", il ne sera pas interprété par python

# Un commentaire sur plusieurs ligne peut être effectué à l'aide de la chaine de caractères ''' avant
# et après le block à commenter. Cependant ce n'est pas le rôle principal de ''' dont le but est plutôt
# de déterminer une longue chaine de caractère

'''
Ceci est un commentaire en bloc
Ce commentaire s'étend
sur trois lignes
'''

x='''
En réalité, cette façon de faire
correspond plutôt à la création
d'une longue chaine de caractère
'''

# Une chaine de charactère est généralement déclaré avec simplement le
# charactère ' ou " avant et après la chaine
y_2='une chaine de charactère'

# Ces chaines peuvent être concaténée avec l'opérateur +

y_1="\nCeci est un exemple d'"
y_3=' (ou "string") :'

y=y_1+y_2+y_3

print(y)
# print est une fonction qui permet de visualiser la variable passée en paramètre (avec formatage)
print(x)

# l'opérateur * permet de multiplier le "pattern" de la chaine de charactère
print('-'*50+'\n')

# Un nombre réel ou entier peut être converti en string via la fonction str
x=1000
y=str(x)

print('voici un nombre converti en string (fonction str) : '+y)
print('\n'+'-'*50+'\n')


###################################
#### 2. Modules et importation ####
###################################

# python permet d'installer facilement divers modules via la console cmd.exe ou un terminal mac
# en tapant directement la commande "pip install XXX" ou XXX est le module désiré.

# Une fois le module XXX installé on utilise "import XXX" dans le script python pour pouvoir utiliser
# les fonctionalités du module.
import urllib2

# certain modules sont déjà pré-installé, d'autres nécessite l'installation via pip install
# d'autres modules plus spécifiques doivent éventuellement être installé manuellement selon
# des instructions particulières. certain modules requier la présence d'autre modules.
import requests


############################################################
#### 3. déclaration de variables et opéarations simples ####
############################################################

# Déclaration d'un entier
x=4
print('voici un nombre entier : '+str(x))

# Déclaration d'un réel
y=4.4
print('voici un nombre réel : '+str(y))

#opération simples
z=x+y
print("voici le résultat de l'addition : "+str(z))

# Attention la variable x à été convertie automatiquement en variable réelle
# La conversion "propre" s'obtient à l'aide des fonctions suivantes
x_float=float(x)
y_int=int(y)
print('conversion en float : '+str(x_float))
print('conversion en int : '+str(y_int))
print('\n'+'-'*50+'\n')

# la fonction type permet d'afficher le type de variable
print(type(x))
print(type(x_float))
print(type(y))
print(type(y_int))

# Attention de mauvaises surprises peuvent subvenir quand on oublie le type de la variable
# et que l'on mélange des variables de type différent
x=4/3
print('4/3 ='+str(x))
x=4/3.0
print('4/3.0 ='+str(x))
x=1.0*4/3
print('1.0*4/3 ='+str(x))
x=(1.0*4)/3
print('(1.0*4)/3 ='+str(x))
x=1.0*(4/3)
print('1.0*(4/3) ='+str(x))
print('\n'+'-'*50+'\n')

# Une astuce rapide consiste en cas de doute à multiplier une variable entière ou réelle
# par le nombre réel 1.0, ce qui rend en sortie une variable réelle de même valeur

# Exposant et modulo
print('Exposant : 4**2 = '+str(4**2))
print('Modulo : 4.4%2 = '+str(4.4%2))

# des fonctions mathematiques
import math
x_sqrt=math.sqrt(x)
e_exp_x=math.exp(x)
sin_x=math.sin(x)

print([x,x_sqrt,e_exp_x,sin_x])
print('\n'+'-'*50+'\n')

#######################
#### 4. conditions ####
#######################

x=5
y='5'
z=int(float(x))

x==y
x==z
x==y and x==z
x==y or x==z

condition=x==y
if condition:
	print('yes')
else:
	print('non')

condition=x==z
if condition:
	print('yes')
else:
	print('non')

x=5.5
y=5.55
z=5.45

print(x<y)
print(y<z)

print(x<y<z)
print(z<x<y)

print(x<y and y<z)
print(x<y or y<z)
	
#################################
#### 5. boucles for et while ####
#################################

liste=[]
print(liste)

liste.append(5)
liste.append(2.45)
liste.append('un')
liste.append('une')
liste.append('des')
print(liste)

# un élément de la liste (la première position est l'indice 0)
print(liste[2])

# la longeur de la liste est données par la fonction "len"
print(len(liste))

# boucle "for"
for i in range(len(liste)):
	print(liste[i])

for element in liste:
	print(element)

# boucle "while"	
compteur=0
while compteur<len(liste):
	print liste[compteur]
	compteur+=1


##############################
#### 6 functions creation ####
##############################

def ma_fonction():
        compteur_max=10
        compteur=1
        while compteur<compteur_max:
                if compteur%2==0:
                        print compteur
                compteur+=1

ma_fonction()
print('\n'+'-'*50+'\n')

def ma_fonction_param(compteur_max=20,modulo=3):
        compteur=1
        while compteur<compteur_max:
                if compteur%modulo==0:
                        print compteur
                compteur+=1

ma_fonction_param()
print('\n'+'-'*50+'\n')

ma_fonction_param(40)
print('\n'+'-'*50+'\n')

ma_fonction_param(40,10)
print('\n'+'-'*50+'\n')


################################
#### 6 read and write files ####
################################

# read
fichier=open('Lexique381.txt', 'r')
text=fichier.read().decode('utf-8')
fichier.close()
text=text.split('\n')
for i in range(len(text)):
    text[i]=text[i].split('\t')

text=text[:(len(text)-1)]

for i in range(30,60):
        print(text[i][0]+' / '+text[i][3])
        
print('\n'+'-'*50+'\n')

for i in range(60,30,-1):
        print(text[i][0]+' / '+text[i][3])

print('\n'+'-'*50+'\n')

for i in range(59,29,-1):
        print(text[i][0]+' / '+text[i][3])

# write
fichier=open('monlexique.txt', "w")
for i in range(len(text)):
        fichier.write(text[i][0].encode('utf-8')+' / '+text[i][3].encode('utf-8')+'\n')
fichier.close()

# exercice: ècrire une fonction qui écrit tous les nombres modulo 5 entre 0 et 100 dans un fichier.
# Ensuite une fonction qui lit une ligne sur deux

def fct_write(name):
        fichier=open(name, "w")
        for i in range(100):
                if i%5==0:
                        fichier.write(str(i)+'\n')
        fichier.close()

def fct_read(name):
        fichier=open(name, 'r')
        text=fichier.read()
        fichier.close()
        text=text.split('\n')
        text=text[:(len(text)-1)]
        nombre=[]
        for i in range(len(text)):
                if i%2==0:
                        nombre.append(int(text[i]))
        return nombre
            
fct_write('exercice.txt')
x=fct_read('exercice.txt')
print(x)


#############################################
#### 7. Graphiques Tkinter et matplotlib ####
#############################################

# Tkinter
from Tkinter import *
import random

def cercle(x, y, r, coulout='black', coulin='red'):
    "tracé d'un cercle de centre (x,y) et de rayon r"
    can.create_oval(x-r, y-r, x+r, y+r, outline=coulout, fill=coulin)
    
def carre(x, y, r, coulout='black', coulin ='blue'):
    "tracé d'un carré de centre (x,y) et de longueur r"
    can.create_rectangle(x-r, y-r, x+r, y+r, outline=coulout, fill=coulin)
    
def damier(longueur=30):
    "liste de pions possibles"
    global liste_tk
    liste_tk=[]
    for i in range(10):
        for j in range(10):
            new=[longueur*(i+1), longueur*(j+1)]
            liste_tk.append(new)
    "dessiner un damier"
    # Effacer d'abord tout dessin préexistant :
    can.delete(ALL)
    # Création des carrés en boucle en couleur alternée par modulo :
    coul=['white','blue']
    for i in range(10):
        for j in range(10):
            carre(longueur*(i+1), longueur*(j+1), longueur/2, 'black', coul[(i+j) % 2])

def pion(longueur=30):
    global liste_tk
    if len(liste_tk) == 0 :
        print('pas de pion disponible')
    else:
        n=random.randint(0,len(liste_tk)-1)
        cercle(liste_tk[n][0],liste_tk[n][1],0.8*(longueur/2))
        liste_tk.remove(liste_tk[n])

# Programme principal damier #
liste=[]
fen=Tk()
can=Canvas(fen,width=11*30,height=11*30,bg='ivory')
can.pack(side=TOP,padx=5,pady=5)
b1=Button(fen,text='damier',command=damier)
b1.pack(side=LEFT,padx=3,pady=3)
b2=Button(fen,text='pion',command=pion)
b2.pack(side=RIGHT,padx=3,pady=3)
fen.mainloop()

# matplotlib

from matplotlib.pyplot import figure, show
from numpy import arange, sin, pi

t=arange(0.0, 1.0, 0.01)

fig=figure(1)

ax1=fig.add_subplot(211)
ax1.plot(t, sin(2*pi*t))
ax1.grid(True)
ax1.set_ylim((-2, 2))
ax1.set_ylabel('1 Hz')
ax1.set_title('A sine wave or two')

for label in ax1.get_xticklabels():
    label.set_color('r')

ax2=fig.add_subplot(212)
ax2.plot(t, sin(2*2*pi*t))
ax2.grid(True)
ax2.set_ylim((-2, 2))
l=ax2.set_xlabel('Axis x')
l.set_color('g')
l.set_fontsize('large')

show()


###############################
#### 8. scrapping web data ####
###############################

import urllib2
from bs4 import BeautifulSoup

response=urllib2.urlopen("https://fr.wikipedia.org/wiki/Liste_des_capitales_du_monde")
page_source=response.read()
soup=BeautifulSoup(page_source,'html.parser')
capitales=[]
for primitive in soup.findAll("td"):
    for text in primitive.findAll("a"):
        if text.string != None:
            capitales.append(text.string)

for i in range(len(capitales)):
    print(capitales[i])
print(len(capitales))


# exercice: Scrapper des prénoms sur
# https://fr.wikipedia.org/wiki/Liste_de_pr%C3%A9noms_fran%C3%A7ais_et_de_la_francophonie

response=urllib2.urlopen("https://fr.wikipedia.org/wiki/Liste_de_pr%C3%A9noms_fran%C3%A7ais_et_de_la_francophonie")
page_source=response.read()
soup=BeautifulSoup(page_source,'html.parser')
prenoms=[]
for dlTag in soup.findAll('dl'):
        for ddTag in dlTag.findAll('dd'):
            bTag = ddTag.find('b')
            if bTag:
                aTag = bTag.find('a')
                if aTag:
                    prenoms.append(aTag.contents[0].encode('utf-8'))

for i in range(len(prenoms)):
    print(prenoms[i])
print(len(prenoms))


##################################
#### 9. Mediawiki bot example ####
##################################

user='Wikipastbot'
passw=urllib2.quote('bot2016')
baseurl='http://wikipast.world/wiki/'
login_params='?action=login&lgname=%s&lgpassword=%s&format=json'% (user,passw)
summary='Créatibot update'

names=['Madame X','Monsieur Y']

# Login request
r1=requests.post(baseurl+'api.php'+login_params)
login_token=r1.json()['login']['token']

#login confirm
login_params2=login_params+'&lgtoken=%s'% login_token
r2=requests.post(baseurl+'api.php'+login_params2,cookies=r1.cookies)

#get edit token2
params3='?format=json&action=query&meta=tokens&continue='
r3=requests.get(baseurl+'api.php'+params3,cookies=r2.cookies)
edit_token=r3.json()['query']['tokens']['csrftoken']

edit_cookie=r2.cookies.copy()
edit_cookie.update(r3.cookies)

# 1. retrouver le contenu et l'imprimer

for name in names:
        result=requests.post(baseurl+'api.php?action=query&titles='+name+'&export&exportnowrap')
        soup=BeautifulSoup(result.text,'html.parser')
        content=''
        for primitive in soup.findAll("text"):
                content+=primitive.string
        print(content)

# 2. changer le contenu

for name in names:
        content=''
        content+='==Biographie==\n'
        content+='''
Lorem ipsum dolor sit amet , consectetur adipiscing elit . Integer at pulvinar tellus . Integer neque lectus , suscipit in lorem et , mollis suscipit neque . Sed commodo orci odio . Cras accumsan id dui ut facilisis . Curabitur vulputate ultricies turpis , eget dapibus lacus tristique non . Quisque vulputate diam nec nulla eleifend , eget sollicitudin dolor dapibus . Pellentesque tristique ultrices lobortis . Sed fringilla placerat odio vel mollis . Fusce eleifend facilisis fringilla . Mauris quam velit , aliquam nec rhoncus ac , efficitur quis leo . Pellentesque lacinia arcu mollis arcu suscipit , vel blandit magna condimentum . Morbi sed elementum nunc . Suspendisse eget quam eget erat tristique fermentum . Vestibulum urna sapien , lobortis sed hendrerit sit amet , blandit et magna . In fermentum , mi quis elementum hendrerit , lacus arcu ullamcorper lectus , a sodales justo diam sed diam .
Maecenas sit amet mi mattis , faucibus lorem eu , tempus sapien . Morbi aliquam commodo ligula nec tincidunt . Integer imperdiet dolor ut enim venenatis , congue gravida sem placerat . Phasellus tempus ipsum eu nisl consequat , et lacinia augue tristique . Integer diam arcu , viverra eleifend leo non , vehicula pretium risus . Donec molestie maximus quam vitae mollis . Nulla congue lacus in augue rutrum scelerisque . Phasellus facilisis neque ultricies nisl bibendum imperdiet . Duis dapibus mauris quis faucibus viverra .
Pellentesque faucibus egestas blandit . Fusce malesuada magna ut sollicitudin mollis . Fusce ut tempus felis . Aliquam eget tempus risus . Nunc et semper tellus . Curabitur imperdiet magna congue est vestibulum , eget tristique justo lacinia . Proin sodales enim dolor , sit amet viverra nibh pellentesque a . Nulla pellentesque sed purus quis viverra . Class aptent taciti sociosqu ad litora torquent per conubia nostra , per inceptos himenaeos . Nam condimentum in leo at molestie . Mauris ullamcorper maximus convallis . Ut cursus consectetur dui , vel pharetra ante ornare eget . Class aptent taciti sociosqu ad litora torquent per conubia nostra , per inceptos himenaeos . Donec dignissim ut magna non scelerisque .
Sed facilisis nulla eget est rhoncus tincidunt . Praesent eu metus non magna ullamcorper tincidunt . Morbi dui velit , aliquet non bibendum sollicitudin , tempus eu purus . Nulla dolor tortor , feugiat ac convallis vitae , rhoncus ultricies tortor . Maecenas bibendum in augue quis aliquet . Fusce at sapien dictum sem luctus malesuada . Cras posuere odio at pellentesque vehicula . Donec consequat neque non dolor varius pulvinar . Integer sit amet porttitor massa . In hac habitasse platea dictumst .
Vivamus pellentesque blandit tellus , eget hendrerit nibh varius ac . Mauris eget cursus justo . Integer at quam sit amet enim tincidunt condimentum . Donec egestas lacinia nisi , ullamcorper imperdiet mauris rutrum eget . Donec viverra luctus efficitur . Suspendisse sed ipsum erat . Sed tincidunt urna interdum arcu sagittis volutpat . Morbi vitae dignissim massa . Ut erat sapien , vulputate vitae nisi vitae , aliquet ullamcorper nunc . Etiam volutpat mi sapien , in pellentesque massa fringilla a . Nunc sed nunc gravida , hendrerit turpis eget , molestie tortor . Vestibulum consectetur nulla at ultricies consectetur . Nam et mattis augue . Pellentesque sed dolor vel ante ultricies tristique a a felis . Etiam a nulla at arcu sodales lacinia in vel elit . '''
        content+='\n==Références==\n'
        content+='=== Ngrams viewer ===\n'
        name_ngv=name.lower().replace(" ","%20")
        content+='[http://dhlabsrv4.epfl.ch/ngviewer.php?mode=1&req_1='+name_ngv+' '+name+']\n'
        content+='=== Archives Le Temps ===\n'
        headers={'content-type':'application/x-www-form-urlencoded'}
        payload={'action':'edit','assert':'user','format':'json','text':content,'summary':summary,'title':name,'token':edit_token}
        r4=requests.post(baseurl+'api.php',headers=headers,data=payload,cookies=edit_cookie)
        print(r4.text)


# exercice: Faire un bot qui modifie le contenu de la page "Madame X" et "Monsieur Y" en fonction
# du contenu précédent. Exemple renmplacer les fautes de type "blabla . Blabla" par "blabla. Blabla".
# Astuce: utiliser la fonction "replace"

for name in names:
        result=requests.post(baseurl+'api.php?action=query&titles='+name+'&export&exportnowrap')
        soup=BeautifulSoup(result.text,'html.parser')
        content=''
        for primitive in soup.findAll("text"):
                content+=primitive.string
        content=content.replace(' .','.')
        content=content.replace(' ,',',')
        print(content)
        headers={'content-type':'application/x-www-form-urlencoded'}
        payload={'action':'edit','assert':'user','format':'json','text':content,'summary':summary,'title':name,'token':edit_token}
        r4=requests.post(baseurl+'api.php',headers=headers,data=payload,cookies=edit_cookie)
        print(r4.text)


Liens externes