« Tutorial python » : différence entre les versions

De Wikipast
Aller à la navigation Aller à la recherche
 
(4 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 programmer 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.
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>
##################################################
##################################################
Ligne 11 : Ligne 10 :
##################################################
##################################################


# Ce tutorial utilise la version 3 de python
# 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 29 : 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 44 : 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'
# Ces chaines peuvent être concaténée avec l'opérateur +
y_1="\nCeci est un exemple d'"
y_3=' (ou "string")'
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)
Ligne 61 : Ligne 54 :
print(x)
print(x)


# Un nombre réel ou entier peut être converti en string via la fonction str
# 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
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 92 : Ligne 102 :


# 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
# si le module n'est pas installé, tapez "pip install request" dans une console de votre portable
Ligne 152 : 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 287 : Ligne 297 :
print('\n'+'-'*50+'\n')
print('\n'+'-'*50+'\n')
################################
################################
#### 6 read and write files ####
#### 7 read and write files ####
################################
################################


# read
# read
nom_fichier='C:/Users/buntinx/Dropbox/DHBachelor2018/tutorial_python/Lexique381.txt'
# à vous de remplacer le path par le votre
fichier=open(nom_fichier,'r')
path='C:/Users/buntinx/Dropbox/DHBachelor2019/tutorial_python/'
nom_fichier='Lexique381.txt'
fichier=open(path+nom_fichier,'r')
text=fichier.read()
text=fichier.read()
fichier.close()
fichier.close()
Ligne 342 : Ligne 354 :
x=fct_read('exercice.txt')
x=fct_read('exercice.txt')
print(x)
print(x)
</nowiki>


print('\n'+'-'*50+'\n')
==Tutorial sur la programmation de bot: Info==
#############################################
#### 7. Graphiques 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)
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.
plot(t,sin(2*pi*t))


show()
==Tutorial sur la programmation de bot: Code==
 
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 ####
###############################
 
from urllib.request import urlopen
from bs4 import BeautifulSoup
 
response=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(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
 
response=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.string)
 
for i in range(len(prenoms)):
    print(prenoms[i])
print('\n'+str(len(prenoms))+' first names listed\n')
 
##################################
#### 9. Mediawiki bot example ####
##################################


<nowiki>
import requests
import requests
from bs4 import BeautifulSoup
from bs4 import BeautifulSoup
Ligne 471 : Ligne 410 :
# rajouter du contenu:
# rajouter du contenu:
for name in names:
for name in names:
         #content='\n==Contenu rajouté==\nVoici du contenu rajouté\n'
         content='\n==Contenu rajouté==\nVoici du contenu rajouté\n'
         content='abcdef'
         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)

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')