« Tutorial python » : différence entre les versions

De Wikipast
Aller à la navigation Aller à la recherche
 
(3 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)==
==Tutorial sur la base: Code==
  <nowiki>
  <nowiki>
##################################################
##################################################
Ligne 354 : 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.
==Tutorial sur la programmation de bot: Code==
<nowiki>
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')
</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')