Python

De Wiki de Nelly & Richard
Sauter à la navigation Sauter à la recherche

Python

Python est langage de programmation orienté objet.

Je vais mettre ici deux ou trois trucs et astuces, classes, exemples, ...

Modules sympathiques

reportlab : Génération de fichier PDF

  • reportlab est un module permettant entre autre la génération de fichier PDF.
  • La documentation disponible sur le site est très bien fournie.

Installation

$ sudo apt-get install python-reportlab
>>> from reportlab.pdfgen import canvas

Exemple

# génération du PDF
class pdf:
  """Génération des PDF"""
  def __init__(self, file):
    self.file = file
    self.canvas = canvas.Canvas(self.file)
    self.incr = 0
    self.decr = 840

  def newPage(self, initIncr = None):
    """Demande d'une nouvelle page"""
    self.canvas.showPage()
    self.decr = 840
    self.drawLine(self.decr-150)
    if initIncr == 0:
      self.incr = 0

  def drawLine(self, y):
    """Création d'une ligne séparatrice"""
    x1 = 0
    y1 = y
    x2 = 596
    y2 = y
    self.canvas.line(x1, y1, x2, y2)

  def drawText(self, info1, info2, info3, info4, info5, info6):
    """Ajout des informations dans le PDF"""
    self.incr += 1
    if self.incr/2.0 == ceil(self.incr/2.0):
      abcisse = 10
    else:
      abcisse = 350
      if self.decr > 170 and self.incr > 1:
        self.decr -= 170
        self.drawLine(self.decr-150)
      elif self.incr ==1:
        self.drawLine(self.decr-150)
      elif self.incr > 1:
        self.newPage()
    # ecriture info utilisateur
    self.canvas.drawString(abcisse, self.decr-20,"INFO1 : " + info1)
    self.canvas.drawString(abcisse, self.decr-40,"INFO2 : " + info2)
    self.canvas.drawString(abcisse, self.decr-60,"INFO3 : " + info3)
    self.canvas.drawString(abcisse, self.decr-80,"INFO4 : " + info4)
    self.canvas.drawString(abcisse, self.decr-100,"INFO5 : " + info5)
    self.canvas.drawString(abcisse, self.decr-120,"INFO6 : " + info6)

  def writePDF(self):
    """Ecrit et ferme le fichier PDF"""
    self.canvas.save()

PythonMagick : ImageMagick for python

  • Implémentation d'ImageMagick en python

Installation

$ sudo apt-get install python-pythonmagick
>>> import PythonMagick

Exemple

>>> from PythonMagick import Image
>>> help(Image)
>>> # déclaration de l'objet Image
>>> pm = Image('./photo.jpg')
>>> # rotation anti-horaire de 90°
>>> pm.rotate(-90)
>>> # Ecriture du fichier
>>> pm.write('./photo.jpg')

csv

Installation

>>> import csv

Exemple

class fileCSV:
  """lecture/ecriture fichier csv"""
  def __init__(self, file, delimiter = ',', lineterminator = '\n'):
    """initialisation de myCSVreader"""
    self.file = file
    self.delimiter = delimiter
    self.lineterminator = lineterminator
  def listCSV(self):
    """transformation du fichier CSV en liste"""
    csvf = open(self.file)
    csvr = csv.reader(csvf, delimiter = self.delimiter, lineterminator = self.lineterminator)
    csvl = list(csvr)
    csvf.close()
    return csvl
  def writeCSV(self, ldata):
    """ecriture d'un fichier CSV"""
    csvf = open(self.file, 'w')
    csvw = csv.writer(csvf, delimiter = self.delimiter, lineterminator = self.lineterminator)
    csvw.writerows(ldata)
    csvf.close()

pyexiv2 : manipulation de données exif

Installation

$ sudo apt-get install python-pyexiv2
>>> import pyexiv2

Exemple

# lecture/ecriture exif
class exif:
  """configuration exif d'une image"""
  def __init__(self, image):
    """initiialisation de la classe"""
    self.image = image
    self.exif = pyexiv2.Image(self.image)
    self.exif.readMetadata()

  def readExifKeys(self):
    """lit les infos exif disponibles"""
    return self.exif.exifKeys()

  def getExifData(self, keys = []):
    """lecture des données exif demandées"""
    dicDataExif = {}
    if len(keys) == 0:
      keys = self.readExifKeys()
    for exifKey in keys:
      dicDataExif[exifKey] = self.exif[exifKey]
    return dicDataExif

  def setExifData(self, dicDataExif):
    """ecriture des données exif demandées"""
    for exifKey in dicDataExif.keys():
      self.exif[exifKey] = dicDataExif[exifKey]
    self.exif.writeMetadata()

  def delThumbnail(self):
    """suppression du thumbnail"""
    self.exif.deleteThumbnail()

  def getComment(self):
    """Get comment exif data"""
    return self.exif.getComment()

  def setComment(self, comment):
    """Set comment exif data"""
    self.exif.setComment(comment)
    self.exif.writeMetadata()

markdown : text to HTML

  • markdown permet de transformer du texte en HTML et vice-versa

Installation

$ sudo apt-get install python-markdown
>>> import markdown

Exemple

>>> from markdown import markdown
>>> a="test\n essai ééééé"
>>> markdown(a.decode('utf-8'))
u'<p>test\n    essai \xe9\xe9\xe9\xe9\xe9\n</p>'
>>> print markdown(a.decode('utf-8'))
<p>test
     essai ééééé
</p>

python-ldap

Installation

$ sudo apt-get install python-ldap
>>> import ldap

Exemple

import ldap

# Classe ldapManip
class ldapManip:
 """Gestion du ldap"""

 def __init__(self, list):
   """Initialise """
   self.server = 'ldap://%s' % (list[0])
   self.country = list[1]
   self.organisation = list[2]
   self.basedn = list[3]
   self.rootpw = list[4]
   self.rootdn = list[5]
   self.smbdomain = list[6]
   self.smbsid = list[7]
   self.dn = list[8]
   self.domain = list[9]
   self.connect = ldap.initialize(self.server)
   self.connect.simple_bind_s(self.dn, self.rootpw)

 def disconnect(self):
   self.connect.unbind_s()

 def mod(self, dn, oldAttrs, newAttrs):
   """Modification dans le ldap"""
   ldif = ldap.modlist.modifyModlist(oldAttrs, newAttrs)
   self.connect.modify_s(dn, ldif)

 def add(self, dn, attrsAdd):
   """Ajout dans le ldap"""
   ldif = ldap.modlist.addModlist(attrsAdd)
   self.connect.add_s(dn, ldif)

 def delete(self, dn):
   """Suppression dans le ldap"""
   self.connect.delete_s(dn)
 
 def search(self, filter, attrs = None):
   """Recherche dans ldap"""
   search = self.connect.search_s(self.basedn, ldap.SCOPE_SUBTREE, filter, attrs)
   return search

unicodedata : suppression des accents

Exemple

>>> import unicodedata
>>> unicodedata.normalize('NFKD',u'ééÉÉÉÏÎ AZEéèàù').encode('ascii','ignore')
'eeEEEII AZEeeau'

python-mysqldb

Installation

$ sudo apt-get install python-mysqldb
>>> import MySQLdb

Exemple

Ce petit exemple permet de se connecter à la base de votre et de lui demander d'exécuter la chaîne SQL de votre choix :

from MySQLdb import connect, DatabaseError

def collectData(host, user, password, db, sql):
 """Récupération des données nécessaires"""
 data = {}
 try:
   conn = connect(host, user, password, db)
 except DatabaseError:
   print """Erreur de connection à la base :\n\thost=%s\n\tdb=%s""" % (host, password)
   exit(2)
 cursor = conn.cursor()
 for i in range(cursor.execute(sql)):
   row = cursor.fetchone()
   if not data.has_key(row[0]):
     data[row[0]] = []
   data[row[0]].append(row[1])
 conn.close()
 return data

SQLObject

  • Tout est sur le site de SQLObject, qui est un Object Relational Manager pour tous type de base de données.

Installation

$ sudo apt-get install python-sqlobject
>>> import sqlobject

email

Exemple

Envoi d'un mail en texte brut :

from email.MIMEText import MIMEText

def sendMail(to, subject, text):
 sender = """toto <toto@domain>"""
 mail = MIMEText(text)
 # pour préserver nos accents
 mail.set_charset('utf-8')
 mail['From'] = sender
 mail['Subject'] = subject
 mail['To'] = sender
 smtp = smtplib.SMTP()
 smtp.connect()
 smtp.sendmail(sender, [to], mail.as_string())
 smtp.close()

Command line

history + completion

  • Sympathique le rappel de commande en BASH, ... et pour python ?
# fichier ~/.pythonrc
import os.path, atexit, rlcompleter

historyPath = os.path.expanduser("/home/USER/.python_history")

def save_history():
    rlcompleter.readline.write_history_file(historyPath)

if os.path.exists(historyPath):
  rlcompleter.readline.read_history_file(historyPath)

atexit.register(save_history)

# completion
rlcompleter.readline.parse_and_bind("tab: complete")
# dans .bashrc
# history python
export PYTHONSTARTUP=/home/USER/.pythonrc

Liens externes