« Tutorial python » : différence entre les versions

De Wikipast
Aller à la navigation Aller à la recherche
 
(8 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.
==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 30 : 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
'''
'''


x
# print est une fonction qui permet de visualiser la variable passée en paramètre (avec formatage)
# print est une fonction qui permet de visualiser la variable passée en paramètre (avec formatage)
print(x)
# 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 \
# Une chaine de charactère est généralement déclaré avec simplement le
# charactère ' ou " avant et après la chaine
x='mon prénom est "Vincent"'
x='mon prénom est "Vincent"'
print(x)
print(x)
Ligne 45 : Ligne 41 :
print(x)
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")'
# 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
y=y_1+y_2+y_3
print(y)
print(y)
y=y_1+y_2+'\n'+y_3
y=y_1+y_2+'\n'+y_3
print(y)
print(y)


# l'opérateur * permet de multiplier le "pattern" de la chaine de charactère
# l'opérateur * permet de multiplier le "pattern" de la chaine de charactère
print('\n'+'-'*50+'\n')
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 être converti en string via la fonction str
# Un nombre réel ou entier peut également ê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)


Ligne 77 : 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')
print('\n'+'-'*50+'\n')
Ligne 115 : 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 126 : 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 136 : Ligne 162 :
print(int(4.4)+(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=2*math.pi
Ligne 143 : Ligne 169 :
cos_x=math.cos(x)
cos_x=math.cos(x)


print([x,x_sqrt,e_exp_x,cos_x])
print(x,x_sqrt,e_exp_x,cos_x)


print('\n'+'-'*50+'\n')
print('\n'+'-'*50+'\n')
Ligne 209 : Ligne 235 :
# 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):
for i in range(3):
         print(liste[i])
         print(liste[i])
Ligne 224 : Ligne 261 :
compteur=0
compteur=0
while compteur<len(liste):
while compteur<len(liste):
print liste[compteur]
print(liste[compteur])
compteur+=1
compteur+=1


Ligne 237 : 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 247 : 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
# à vous de remplacer le path par le votre
path='C:/Users/buntinx/Dropbox/DHBachelor2019/tutorial_python/'
nom_fichier='Lexique381.txt'
nom_fichier='Lexique381.txt'
#nom_fichier='C:/Users/buntinx/Dropbox/DHBachelor2017/tutorial_python/Lexique381.txt'
fichier=open(path+nom_fichier,'r')
fichier=open(nom_fichier,'r')
text=fichier.read()
text=fichier.read().decode('utf-8')
fichier.close()
fichier.close()
text=text.split('\n')
text=text.split('\n')
Ligne 279 : Ligne 316 :
         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 292 : 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.
def fct_write(name):
# Ensuite une fonction qui lit une ligne sur deux
        fichier=open(name, "w")
        for i in range(100):
                if i%5==0:
                        fichier.write(str(i)+'\n')
        fichier.close()


print('\n'+'-'*50+'\n')
def fct_read(name):
#############################################
        fichier=open(name, 'r')
#### 7. Graphiques Tkinter et matplotlib ####
        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)
</nowiki>


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


def cercle(x, y, r, coulout='black', coulin='red'):
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.
    "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):
==Tutorial sur la programmation de bot: Code==
    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 #
<nowiki>
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
import matplotlib as plt
from matplotlib.pyplot import figure, show, plot
from numpy import arange, sin, pi
 
t=arange(0.0, 5.0, 0.01)
plot(t,sin(2*pi*t))
 
show()
 
fig=figure()
 
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_and_countries=[]
for primitive in soup.findAll("table"):
    if primitive.find("th").string=='Capitale':
        for cap_and_count in primitive.findAll("td"):
            for text in cap_and_count.findAll("a"):
                if text.string != None:
                    capitales_and_countries.append(unicode(text.string))
   
for i in range(len(capitales_and_countries)):
    print(capitales_and_countries[i])
print('\n'+str(len(capitales_and_countries))+' capitales and countries listed\n')
 
# exercice: Scrapper des prénoms sur
# https://fr.wikipedia.org/wiki/Liste_de_pr%C3%A9noms_fran%C3%A7ais_et_de_la_francophonie
 
##################################
#### 9. Mediawiki bot example ####
##################################
 
import urllib2
import requests
import requests
from bs4 import BeautifulSoup
from bs4 import BeautifulSoup
Ligne 445 : Ligne 394 :
     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, "lxml")
     soup=BeautifulSoup(result.text, "lxml")
    #soup=BeautifulSoup(result.text)
     code=''
     code=''
     for primitive in soup.findAll("text"):
     for primitive in soup.findAll("text"):
Ligne 453 : Ligne 401 :
# 2. changer le contenu
# 2. changer le contenu


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


# exercice: Faire un bot qui modifie le contenu de la page "Madame X" et "Monsieur Y" en fonction
# exercice: Faire un bot qui rajoute des commentaires sur les pages "Madame X" et "Monsieur Y" ou bien en change son contenu
# du contenu précédent. Exemple renmplacer les fautes de type "blabla . Blabla" par "blabla. Blabla".
# exemple: remplacement de mots par d'autres, inversions de majuscules et minuscules, etc....
# Astuce: utiliser la fonction "replace"
 
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')
</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')