« Tutorial python » : différence entre les versions

De Wikipast
Aller à la navigation Aller à la recherche
Aucun résumé des modifications
 
(10 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
==Info==
==Tutorial sur la base: Info==


Ceci est une introduction simple au language python en vue de programer un bot Wikipast.
Ceci est une introduction simple au language python en vue de programmer un bot Wikipast.
 
Le fichier "Lexique381.txt" peut être téléchargé à l'adresse http://www.lexique.org/telLexique.php.
Ce tutoriel sera mis à jour au fur et à mesure du cours pour faciliter les exercices.
 
==Code==


==Tutorial sur la base: Code==
  <nowiki>
  <nowiki>
# -*- 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 ####
#### 1. Commentaires et chaine de charactères ####
##################################################
##################################################
# Ce court tutorial utilise la version 3 de python


# Un commentaire est une ligne de code commençant par le charactère "#", il ne sera pas interprété par python
# Un commentaire est une ligne de code commençant par le charactère "#", il ne sera pas interprété par python
Ligne 33 : Ligne 28 :
correspond plutôt à la création
correspond plutôt à la création
d'une longue chaine de caractère
d'une longue chaine de caractère
celle-ci est attribuée à la variable x
'''
'''


# Une chaine de charactère est généralement déclaré avec simplement le
# print est une fonction qui permet de visualiser la variable passée en paramètre (avec formatage)
# charactère ' ou " avant et après la chaine
# Une chaine de charactère est généralement déclarée avec ' ou " avant et après la chaine en question
# il est bien sur possible d'échapper le caractère avec \
x='mon prénom est "Vincent"'
print(x)
x="mon prénom est 'Vincent'"
print(x)
x='mon prénom est \'Vincent\''
print(x)
 
# Ces chaines peuvent être concaténées grâce à l'opérateur +
y_1="\nCeci est un exemple d'"
y_2='une chaine de charactère'
y_2='une chaine de charactère'
y_3=' (ou "string")'
y=y_1+y_2+y_3
print(y)
y=y_1+y_2+'\n'+y_3
print(y)
# l'opérateur * permet de multiplier le "pattern" de la chaine de charactère
x='\n'+'1e poussin fait '+'piou'*2+'\n'
print(x)


# Ces chaines peuvent être concaténée avec l'opérateur +
# une chaîne peut être séparée par un caractère quelquonque
# via la fonction split qui donne une list d'élément
x='piou-piou'
print(x.split('-'))


y_1="\nCeci est un exemple d'"
# inversément une liste peut être concaténée par un caractère quelquonque
y_3=' (ou "string") :'
# via la fonction join qui donne une chaîne en sortie
x=['piou','piou']
print('-'.join(x))


y=y_1+y_2+y_3
# l'opération * multiplie aussi le patern dans une liste
x=['piou']*2
print('-'.join(x))


print(y)
# en combinant les expressions
# print est une fonction qui permet de visualiser la variable passée en paramètre (avec formatage)
x='\n'+'1e poussin fait '+'-'.join(['piou']*2)+'\n'
print(x)
print(x)


# l'opérateur * permet de multiplier le "pattern" de la chaine de charactère
# Un nombre réel ou entier peut également être converti en string via la fonction str
print('-'*50+'\n')
 
# Un nombre réel ou entier peut être converti en string via la fonction str
x=1000
x=1000
y=str(x)
y=str(x)
print('voici un nombre converti en string (fonction str) : '+y)


print('voici un nombre converti en string (fonction str) : '+y)
print('\n'+'-'*50+'\n')
print('\n'+'-'*50+'\n')
###################################
###################################
#### 2. Modules et importation ####
#### 2. Modules et importation ####
Ligne 70 : Ligne 87 :
# Une fois le module XXX installé on utilise "import XXX" dans le script python pour pouvoir utiliser
# Une fois le module XXX installé on utilise "import XXX" dans le script python pour pouvoir utiliser
# les fonctionalités du module.
# les fonctionalités du module.
import urllib2
 
import urllib.request
 
# la fonction dir permets de retrouver les caractéristiques et méthodes rattachés au module
dir(urllib.request)
 
# On peut aussi utiliser "from XXX import YYY" pour importer la fonction YYY du module XXX.
 
from urllib.request import urlopen
 
# la fonction dir peut aussi être appliquée à une fonction
dir(urlopen)
print(urlopen.__doc__)


# certain modules sont déjà pré-installé, d'autres nécessite l'installation via pip install
# 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
# d'autres modules plus spécifiques doivent éventuellement être installés manuellement selon
# des instructions particulières. certain modules requier la présence d'autre modules.
# des instructions particulières. certains modules requierent la présence d'autres modules.
import requests
import requests
# si le module n'est pas installé, tapez "pip install request" dans une console de votre portable


 
print('\n'+'-'*50+'\n')
############################################################
############################################################
#### 3. déclaration de variables et opéarations simples ####
#### 3. déclaration de variables et opéarations simples ####
Ligne 100 : Ligne 130 :
print('conversion en float : '+str(x_float))
print('conversion en float : '+str(x_float))
print('conversion en int : '+str(y_int))
print('conversion en int : '+str(y_int))
print('\n'+'-'*50+'\n')


# la fonction type permet d'afficher le type de variable
# la fonction type permet d'afficher le type de variable
Ligne 109 : Ligne 138 :


# Attention de mauvaises surprises peuvent subvenir quand on oublie le type de la variable
# 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
# et que l'on mélange des variables de type différent (seulement en python 2)
x=4/3
x=4/3
print('4/3 ='+str(x))
print('4/3 ='+str(x))
Ligne 120 : Ligne 149 :
x=1.0*(4/3)
x=1.0*(4/3)
print('1.0*(4/3) ='+str(x))
print('1.0*(4/3) ='+str(x))
print('\n'+'-'*50+'\n')
 
print(str(x))
print(int(x))
print(float(x))


# Une astuce rapide consiste en cas de doute à multiplier une variable entière ou réelle
# Une astuce rapide consiste en cas de doute à multiplier une variable entière ou réelle
Ligne 128 : Ligne 160 :
print('Exposant : 4**2 = '+str(4**2))
print('Exposant : 4**2 = '+str(4**2))
print('Modulo : 4.4%2 = '+str(4.4%2))
print('Modulo : 4.4%2 = '+str(4.4%2))
print(int(4.4)+(4.4%2))


# des fonctions mathematiques
# des fonctions mathematiques simples
import math
import math
x=2*math.pi
x_sqrt=math.sqrt(x)
x_sqrt=math.sqrt(x)
e_exp_x=math.exp(x)
e_exp_x=math.exp(x)
sin_x=math.sin(x)
cos_x=math.cos(x)
 
print(x,x_sqrt,e_exp_x,cos_x)


print([x,x_sqrt,e_exp_x,sin_x])
print('\n'+'-'*50+'\n')
print('\n'+'-'*50+'\n')
#######################
#######################
#### 4. conditions ####
#### 4. conditions ####
Ligne 175 : Ligne 209 :
print(x<y and y<z)
print(x<y and y<z)
print(x<y or y<z)
print(x<y or y<z)
 
print(x<=y)
print(x<=x)
print(x<x)
 
print('\n'+'-'*50+'\n')
#################################
#################################
#### 5. boucles for et while ####
#### 5. boucles for et while ####
Ligne 191 : Ligne 230 :


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


# la longeur de la liste est données par la fonction "len"
# la longeur de la liste est données par la fonction "len"
print(len(liste))
print(len(liste))
# le dernier élément de la liste
print(liste[len(liste)-1])
print(liste[-1])
# extraire plusieurs éléments de la liste
print(liste[2:4])
print(liste[:4])
print(liste[2:])
print(liste[-3:])
print(liste[:-3])
print(liste[-3:-1])


# boucle "for"
# boucle "for"
for i in range(3):
        print(liste[i])
for i in range(len(liste)):
for i in range(len(liste)):
print(liste[i])
print(liste[i])
Ligne 203 : Ligne 258 :
print(element)
print(element)


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


 
print('\n'+'-'*50+'\n')
##############################
##############################
#### 6 functions creation ####
#### 6 functions creation ####
Ligne 219 : Ligne 274 :
         while compteur<compteur_max:
         while compteur<compteur_max:
                 if compteur%2==0:
                 if compteur%2==0:
                         print compteur
                         print(compteur)
                 compteur+=1
                 compteur+=1


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


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


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


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


ma_fonction_param(40,10)
ma_fonction_param(40,10)
print('\n'+'-'*50+'\n')
print('\n'+'-'*50+'\n')
################################
################################
#### 6 read and write files ####
#### 7 read and write files ####
################################
################################


# read
# read
fichier=open('Lexique381.txt', 'r')
# à vous de remplacer le path par le votre
text=fichier.read().decode('utf-8')
path='C:/Users/buntinx/Dropbox/DHBachelor2019/tutorial_python/'
nom_fichier='Lexique381.txt'
fichier=open(path+nom_fichier,'r')
text=fichier.read()
fichier.close()
fichier.close()
text=text.split('\n')
text=text.split('\n')
Ligne 258 : Ligne 315 :
for i in range(30,60):
for i in range(30,60):
         print(text[i][0]+' / '+text[i][3])
         print(text[i][0]+' / '+text[i][3])
       
 
print('\n'+'-'*50+'\n')
print('\n'+'-'*10+'\n')


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


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


for i in range(59,29,-1):
for i in range(59,29,-1):
Ligne 272 : Ligne 329 :
fichier=open('monlexique.txt', "w")
fichier=open('monlexique.txt', "w")
for i in range(len(text)):
for i in range(len(text)):
         fichier.write(text[i][0].encode('utf-8')+' / '+text[i][3].encode('utf-8')+'\n')
         fichier.write(text[i][0]+' / '+text[i][3]+'\n')
fichier.close()
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):
def fct_write(name):
Ligne 300 : Ligne 354 :
x=fct_read('exercice.txt')
x=fct_read('exercice.txt')
print(x)
print(x)
</nowiki>


==Tutorial sur la programmation de bot: Info==


#############################################
Ceci est une introduction à la programation d'un bot Wikipast. Il s'agit ici d'ajouter et de modifier le contenu des pages "Madame X" et "Monsieur Y", créées uniquement dans le but de servir de page "bac à sable" pour exercer les scripts de bots sans conséquences sur Wikipast.
#### 7. Graphiques Tkinter et matplotlib ####
#############################################


# Tkinter
==Tutorial sur la programmation de bot: Code==
from Tkinter import *
import random


def cercle(x, y, r, coulout='black', coulin='red'):
<nowiki>
    "tracé d'un cercle de centre (x,y) et de rayon r"
import requests
    can.create_oval(x-r, y-r, x+r, y+r, outline=coulout, fill=coulin)
from bs4 import BeautifulSoup
   
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):
user='testbot'
    global liste_tk
passw='dhbot2017'
    if len(liste_tk) == 0 :
baseurl='http://wikipast.epfl.ch/wikipast/'
        print('pas de pion disponible')
summary='Wikipastbot update'
    else:
names=['Madame X','Monsieur Y']
        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 #
# Login request
liste=[]
payload={'action':'query','format':'json','utf8':'','meta':'tokens','type':'login'}
fen=Tk()
r1=requests.post(baseurl + 'api.php', data=payload)
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
#login confirm
login_token=r1.json()['query']['tokens']['logintoken']
payload={'action':'login','format':'json','utf8':'','lgname':user,'lgpassword':passw,'lgtoken':login_token}
r2=requests.post(baseurl + 'api.php', data=payload, cookies=r1.cookies)


from matplotlib.pyplot import figure, show
#get edit token2
from numpy import arange, sin, pi
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']


t=arange(0.0, 1.0, 0.01)
edit_cookie=r2.cookies.copy()
edit_cookie.update(r3.cookies)


fig=figure(1)
# 1. retrouver le contenu et l'imprimer


ax1=fig.add_subplot(211)
for name in names:
ax1.plot(t, sin(2*pi*t))
    result=requests.post(baseurl+'api.php?action=query&titles='+name+'&export&exportnowrap')
ax1.grid(True)
    soup=BeautifulSoup(result.text, "lxml")
ax1.set_ylim((-2, 2))
    code=''
ax1.set_ylabel('1 Hz')
    for primitive in soup.findAll("text"):
ax1.set_title('A sine wave or two')
        code+=primitive.string
    print(code)


for label in ax1.get_xticklabels():
# 2. changer le contenu
    label.set_color('r')


ax2=fig.add_subplot(212)
# écraser le contenu précédent:
ax2.plot(t, sin(2*2*pi*t))
for name in names:
ax2.grid(True)
        content='==Contenu==\nVoici un contenu qui a écrasé le précédent\n'
ax2.set_ylim((-2, 2))
        payload={'action':'edit','assert':'user','format':'json','utf8':'','text':content,'summary':summary,'title':name,'token':edit_token}
l=ax2.set_xlabel('Axis x')
        r4=requests.post(baseurl+'api.php',data=payload,cookies=edit_cookie)
l.set_color('g')
        print(r4.text)
l.set_fontsize('large')


show()
# rajouter du contenu:
for name in names:
        content='\n==Contenu rajouté==\nVoici du contenu rajouté\n'
        content+='abcdef'
        payload={'action':'edit','assert':'user','format':'json','utf8':'','appendtext':content,'summary':summary,'title':name,'token':edit_token}
        r4=requests.post(baseurl+'api.php',data=payload,cookies=edit_cookie)
        print(r4.text)


# exercice: Faire un bot qui rajoute des commentaires sur les pages "Madame X" et "Monsieur Y" ou bien en change son contenu
# exemple: remplacement de mots par d'autres, inversions de majuscules et minuscules, etc....


###############################
import requests
#### 8. scrapping web data ####
###############################
 
import urllib2
from bs4 import BeautifulSoup
from bs4 import BeautifulSoup


response=urllib2.urlopen("https://fr.wikipedia.org/wiki/Liste_des_capitales_du_monde")
user='testbot'
page_source=response.read()
passw='dhbot2017'
soup=BeautifulSoup(page_source,'html.parser')
baseurl='http://wikipast.epfl.ch/wikipast/'
capitales=[]
summary='Wikipastbot update'
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']
names=['Madame X','Monsieur Y']


# Login request
# Login request
r1=requests.post(baseurl+'api.php'+login_params)
payload={'action':'query','format':'json','utf8':'','meta':'tokens','type':'login'}
login_token=r1.json()['login']['token']
r1=requests.post(baseurl + 'api.php', data=payload)


#login confirm
#login confirm
login_params2=login_params+'&lgtoken=%s'% login_token
login_token=r1.json()['query']['tokens']['logintoken']
r2=requests.post(baseurl+'api.php'+login_params2,cookies=r1.cookies)
payload={'action':'login','format':'json','utf8':'','lgname':user,'lgpassword':passw,'lgtoken':login_token}
r2=requests.post(baseurl + 'api.php', data=payload, cookies=r1.cookies)


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


Ligne 454 : Ligne 445 :
edit_cookie.update(r3.cookies)
edit_cookie.update(r3.cookies)


# 1. retrouver le contenu et l'imprimer
def minuscule(name):
 
for name in names:
         result=requests.post(baseurl+'api.php?action=query&titles='+name+'&export&exportnowrap')
         result=requests.post(baseurl+'api.php?action=query&titles='+name+'&export&exportnowrap')
         soup=BeautifulSoup(result.text,'html.parser')
         soup=BeautifulSoup(result.text, "lxml")
         content=''
         content=''
         for primitive in soup.findAll("text"):
         for primitive in soup.findAll("text"):
                 content+=primitive.string
                 content+=primitive.string
        print(content)
         content=content.lower()
 
         payload={'action':'edit','assert':'user','format':'json','utf8':'','text':content,'summary':summary,'title':name,'token':edit_token}
# 2. changer le contenu
         r4=requests.post(baseurl+'api.php',data=payload,cookies=edit_cookie)
 
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)
         print(r4.text)


 
def majuscule(name):
# 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')
         result=requests.post(baseurl+'api.php?action=query&titles='+name+'&export&exportnowrap')
         soup=BeautifulSoup(result.text,'html.parser')
         soup=BeautifulSoup(result.text, "lxml")
         content=''
         content=''
         for primitive in soup.findAll("text"):
         for primitive in soup.findAll("text"):
                 content+=primitive.string
                 content+=primitive.string
         content=content.replace(' .','.')
         content=content.upper()
        content=content.replace(' ,',',')
         payload={'action':'edit','assert':'user','format':'json','utf8':'','text':content,'summary':summary,'title':name,'token':edit_token}
        print(content)
         r4=requests.post(baseurl+'api.php',data=payload,cookies=edit_cookie)
        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)
         print(r4.text)


majuscule('Monsieur Y')
minuscule('Monsieur Y')
majuscule('Madame X')
</nowiki>
</nowiki>

Dernière version du 19 mars 2019 à 09:40

Tutorial sur la base: Info

Ceci est une introduction simple au language python en vue de programmer un bot Wikipast. Le fichier "Lexique381.txt" peut être téléchargé à l'adresse http://www.lexique.org/telLexique.php.

Tutorial sur la base: Code

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

# Ce court tutorial utilise la version 3 de python

# 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
celle-ci est attribuée à la variable x
'''

# print est une fonction qui permet de visualiser la variable passée en paramètre (avec formatage)
# Une chaine de charactère est généralement déclarée avec ' ou " avant et après la chaine en question
# il est bien sur possible d'échapper le caractère avec \
x='mon prénom est "Vincent"'
print(x)
x="mon prénom est 'Vincent'"
print(x)
x='mon prénom est \'Vincent\''
print(x)

# Ces chaines peuvent être concaténées grâce à l'opérateur +
y_1="\nCeci est un exemple d'"
y_2='une chaine de charactère'
y_3=' (ou "string")'
y=y_1+y_2+y_3
print(y)
y=y_1+y_2+'\n'+y_3
print(y)

# l'opérateur * permet de multiplier le "pattern" de la chaine de charactère
x='\n'+'1e poussin fait '+'piou'*2+'\n'
print(x)

# une chaîne peut être séparée par un caractère quelquonque
# via la fonction split qui donne une list d'élément
x='piou-piou'
print(x.split('-'))

# inversément une liste peut être concaténée par un caractère quelquonque
# via la fonction join qui donne une chaîne en sortie
x=['piou','piou']
print('-'.join(x))

# l'opération * multiplie aussi le patern dans une liste
x=['piou']*2
print('-'.join(x))

# en combinant les expressions
x='\n'+'1e poussin fait '+'-'.join(['piou']*2)+'\n'
print(x)

# Un nombre réel ou entier peut également ê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 urllib.request

# la fonction dir permets de retrouver les caractéristiques et méthodes rattachés au module
dir(urllib.request)

# On peut aussi utiliser "from XXX import YYY" pour importer la fonction YYY du module XXX.

from urllib.request import urlopen

# la fonction dir peut aussi être appliquée à une fonction
dir(urlopen)
print(urlopen.__doc__)

# 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és manuellement selon
# des instructions particulières. certains modules requierent la présence d'autres modules.
import requests
# si le module n'est pas installé, tapez "pip install request" dans une console de votre portable

print('\n'+'-'*50+'\n')
############################################################
#### 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))

# 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 (seulement en python 2)
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(str(x))
print(int(x))
print(float(x))

# 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))
print(int(4.4)+(4.4%2))

# des fonctions mathematiques simples
import math
x=2*math.pi
x_sqrt=math.sqrt(x)
e_exp_x=math.exp(x)
cos_x=math.cos(x)

print(x,x_sqrt,e_exp_x,cos_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)

print(x<=y)
print(x<=x)
print(x<x)

print('\n'+'-'*50+'\n')
#################################
#### 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[0])
print(liste[2])

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

# le dernier élément de la liste
print(liste[len(liste)-1])
print(liste[-1])

# extraire plusieurs éléments de la liste
print(liste[2:4])
print(liste[:4])
print(liste[2:])
print(liste[-3:])
print(liste[:-3])
print(liste[-3:-1])

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

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

print('\n'+'-'*50+'\n')
##############################
#### 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'+'-'*10+'\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'+'-'*10+'\n')

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

ma_fonction_param(40,10)

print('\n'+'-'*50+'\n')
################################
#### 7 read and write files ####
################################

# read
# à vous de remplacer le path par le votre
path='C:/Users/buntinx/Dropbox/DHBachelor2019/tutorial_python/'
nom_fichier='Lexique381.txt'
fichier=open(path+nom_fichier,'r')
text=fichier.read()
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'+'-'*10+'\n')

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

print('\n'+'-'*10+'\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]+' / '+text[i][3]+'\n')
fichier.close()

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)

Tutorial sur la programmation de bot: Info

Ceci est une introduction à la programation d'un bot Wikipast. Il s'agit ici d'ajouter et de modifier le contenu des pages "Madame X" et "Monsieur Y", créées uniquement dans le but de servir de page "bac à sable" pour exercer les scripts de bots sans conséquences sur Wikipast.

Tutorial sur la programmation de bot: Code

import requests
from bs4 import BeautifulSoup

user='testbot'
passw='dhbot2017'
baseurl='http://wikipast.epfl.ch/wikipast/'
summary='Wikipastbot update'
names=['Madame X','Monsieur Y']

# Login request
payload={'action':'query','format':'json','utf8':'','meta':'tokens','type':'login'}
r1=requests.post(baseurl + 'api.php', data=payload)

#login confirm
login_token=r1.json()['query']['tokens']['logintoken']
payload={'action':'login','format':'json','utf8':'','lgname':user,'lgpassword':passw,'lgtoken':login_token}
r2=requests.post(baseurl + 'api.php', data=payload, 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, "lxml")
    code=''
    for primitive in soup.findAll("text"):
        code+=primitive.string
    print(code)

# 2. changer le contenu

# écraser le contenu précédent:
for name in names:
        content='==Contenu==\nVoici un contenu qui a écrasé le précédent\n'
        payload={'action':'edit','assert':'user','format':'json','utf8':'','text':content,'summary':summary,'title':name,'token':edit_token}
        r4=requests.post(baseurl+'api.php',data=payload,cookies=edit_cookie)
        print(r4.text)

# rajouter du contenu:
for name in names:
        content='\n==Contenu rajouté==\nVoici du contenu rajouté\n'
        content+='abcdef'
        payload={'action':'edit','assert':'user','format':'json','utf8':'','appendtext':content,'summary':summary,'title':name,'token':edit_token}
        r4=requests.post(baseurl+'api.php',data=payload,cookies=edit_cookie)
        print(r4.text)

# exercice: Faire un bot qui rajoute des commentaires sur les pages "Madame X" et "Monsieur Y" ou bien en change son contenu
# exemple: remplacement de mots par d'autres, inversions de majuscules et minuscules, etc....

import requests
from bs4 import BeautifulSoup

user='testbot'
passw='dhbot2017'
baseurl='http://wikipast.epfl.ch/wikipast/'
summary='Wikipastbot update'
names=['Madame X','Monsieur Y']

# Login request
payload={'action':'query','format':'json','utf8':'','meta':'tokens','type':'login'}
r1=requests.post(baseurl + 'api.php', data=payload)

#login confirm
login_token=r1.json()['query']['tokens']['logintoken']
payload={'action':'login','format':'json','utf8':'','lgname':user,'lgpassword':passw,'lgtoken':login_token}
r2=requests.post(baseurl + 'api.php', data=payload, 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)

def minuscule(name):
        result=requests.post(baseurl+'api.php?action=query&titles='+name+'&export&exportnowrap')
        soup=BeautifulSoup(result.text, "lxml")
        content=''
        for primitive in soup.findAll("text"):
                content+=primitive.string
        content=content.lower()
        payload={'action':'edit','assert':'user','format':'json','utf8':'','text':content,'summary':summary,'title':name,'token':edit_token}
        r4=requests.post(baseurl+'api.php',data=payload,cookies=edit_cookie)
        print(r4.text)

def majuscule(name):
        result=requests.post(baseurl+'api.php?action=query&titles='+name+'&export&exportnowrap')
        soup=BeautifulSoup(result.text, "lxml")
        content=''
        for primitive in soup.findAll("text"):
                content+=primitive.string
        content=content.upper()
        payload={'action':'edit','assert':'user','format':'json','utf8':'','text':content,'summary':summary,'title':name,'token':edit_token}
        r4=requests.post(baseurl+'api.php',data=payload,cookies=edit_cookie)
        print(r4.text)

majuscule('Monsieur Y')
minuscule('Monsieur Y')
majuscule('Madame X')