Dans cette section, nous allons examiner quelques-uns des nombreux modules utilitaires standards de Python permettant de résoudre des problèmes courants.
Système de fichiers : os, os.path, stopil
Les modules *os* et *os.path* incluent de nombreuses fonctions permettant d'interagir avec le système de fichiers. Le module *shutil* peut copier des fichiers.
- documentation du module os
- noms de fichiers = os.listdir(dir) : liste de noms de fichiers présents dans le chemin d'accès au répertoire (à l'exclusion de . et...). Les noms de fichiers sont simplement les noms du répertoire, pas leurs chemins d’accès absolus.
- os.path.join(dir, username) : en fonction d'un nom de fichier de la liste ci-dessus, utilisez cette commande pour assembler le répertoire dir et le nom de fichier afin de créer un chemin d'accès.
- os.path.abspath(path) : en fonction d'un chemin d'accès, renvoie une forme absolue, par exemple /home/nick/foo/bar.html
- os.path.dirname(path), os.path.basename(path) : renvoie le nom de répertoire "dir/foo" et nom de base "bar.html"
- os.path.exists(path) : vrai s'il existe
- os.mkdir(dir_path) : crée un répertoire, os.makedirs(dir_path) crée tous les répertoires nécessaires dans ce chemin
- stopil.copy(source-path, dest-path) : copie un fichier (les répertoires du chemin d’accès doivent exister)
## Example pulls filenames from a dir, prints their relative and absolute paths def printdir(dir): filenames = os.listdir(dir) for filename in filenames: print(filename) ## foo.txt print(os.path.join(dir, filename)) ## dir/foo.txt (relative to current dir) print(os.path.abspath(os.path.join(dir, filename))) ## /home/nick/dir/foo.txt
L'exploration d'un module fonctionne bien avec les fonctions Python help() et dir() intégrées. Dans l'interpréteur, exécutez une commande "import os", puis exécutez les commandes suivantes pour examiner les ressources disponibles dans le module: dir(os), help(os.listdir), dir(os.path), help(os.path.dirname).
Processus externes en cours d'exécution -- sous-processus
Le module *subprocess* est un moyen simple d'exécuter une commande externe et d'en capturer le résultat.
- documentation sur le module de sous-processus
- sortie = subprocess.check_output(cmd, stderr=subprocess.STDOUT) -- exécute la commande, attend qu'elle se termine et renvoie son texte de sortie. La commande est exécutée avec sa sortie standard et son erreur standard combinées dans un texte de sortie unique. En cas d'échec, il génère une erreur CalledProcessError.
- Si vous souhaitez avoir plus de contrôle sur l'exécution du sous-processus, consultez la classe subprocess.popen.
- Il existe également un simple subprocess.call(cmd) qui exécute la commande, transmet sa sortie à votre sortie et renvoie son code d'erreur. Cela fonctionne si vous souhaitez exécuter la commande, mais que vous n'avez pas besoin d'enregistrer sa sortie dans vos structures de données Python.
import subprocess ## Given a dir path, run an external 'ls -l' on it -- ## shows how to call an external program def listdir(dir): cmd = 'ls -l ' + dir print("Command to run:", cmd) ## good to debug cmd before actually running it (status, output) = subprocess.getstatusoutput(cmd) if status: ## Error case, print the command's output to stderr and exit sys.stderr.write(output) sys.exit(status) print(output) ## Otherwise do something with the command's output
Exceptions
Une exception correspond à une erreur d'exécution qui interrompt l'exécution normale sur une ligne spécifique et transfère le contrôle au code de gestion des erreurs. Cette section présente les utilisations les plus élémentaires des exceptions. Par exemple, une erreur d'exécution peut être due au fait qu'une variable utilisée dans le programme n'a pas de valeur (ValueError ... vous avez probablement vu cette erreur plusieurs fois) ou une erreur d'opération d'ouverture de fichier parce qu'un fichier n'existe pas (IOError). Pour en savoir plus, consultez le tutoriel sur les exceptions et consultez la liste complète des exceptions.
Sans aucun code de gestion des erreurs (comme nous l'avons fait jusqu'à présent), une exception d'exécution interrompt simplement le programme avec un message d'erreur. C'est un bon comportement par défaut, que vous avez vu plusieurs fois. Vous pouvez ajouter une expression "try/except" à votre code pour gérer les exceptions, comme ceci:
try: ## Either of these two lines could throw an IOError, say ## if the file does not exist or the read() encounters a low level error. f = open(filename, 'rb') data = f.read() f.close() except IOError: ## Control jumps directly to here if any of the above lines throws IOError. sys.stderr.write('problem reading:' + filename) ## In any case, the code then continues with the line after the try/except
La section try: inclut le code qui peut générer une exception. La section except: contient le code à exécuter en cas d'exception. En l'absence d'exception, la section "sauf :" est ignorée (c'est-à-dire que ce code est uniquement destiné à la gestion des erreurs, et non au cas "normal" du code). Vous pouvez obtenir un pointeur vers l'objet d'exception lui-même avec la syntaxe "sauf IOError comme e: ..". (e pointe vers l'objet d'exception).
HTTP : urllib et urlparse
Le module *urllib.request* permet la récupération d'URL, qui donne l'impression qu'une URL est un fichier lisible. Le module *urlparse* peut démonter et rassembler des URL.
- Documentation du module urllib.request
- ufile = urllib.request.urlopen(url) : renvoie un objet de type fichier pour cette URL
- text = ufile.read() -- peut lire depuis ce fichier, comme un fichier (readlines(), etc. fonctionne également)
- info = ufile.info() -- les métadonnées de cette requête. info.gettype() est le type MIME, par exemple 'text/html'
- baseurl = ufile.geturl() -- obtient le "base" URL de la requête, qui peut être différente de l'URL d'origine en raison de redirections
- urllib.request.urlretrieve(url, username) : télécharge les données des URL vers le chemin d'accès au fichier indiqué.
- urllib.parse.urljoin(baseurl, url) : en fonction d'une URL complète ou non, et de l'URL de base de la page d'origine, renvoient une URL complète. Utilisez geturl() ci-dessus pour fournir l'URL de base.
Toutes les exceptions se trouvent dans urllib.error.
from urllib.request import urlopen ## Given a url, try to retrieve it. If it's text/html, ## print its base url and its text. def wget(url): ufile = urlopen(url) ## get file-like object for url info = ufile.info() ## meta-info about the url content if info.get_content_type() == 'text/html': print('base url:' + ufile.geturl()) text = ufile.read() ## read all its text print(text)
Le code ci-dessus fonctionne correctement, mais n'inclut pas la gestion des erreurs si une URL ne fonctionne pas pour une raison quelconque. Voici une version de la fonction qui ajoute une logique "try/except" pour afficher un message d'erreur en cas d'échec de l'opération d'URL.
Si urlopen()
semble être suspendu, il se peut que votre système n'autorise pas l'accès direct à certains
http. Pour le vérifier, essayez de récupérer la même URL à l'aide de wget
ou
curl
Si ces programmes échouent également, vous devrez récupérer le contenu HTTP par le biais d'un proxy
Google Cloud. La configuration de l'accès proxy n'est pas abordée dans ce tutoriel.
## Version that uses try/except to print an error message if the ## urlopen() fails. def wget2(url): try: ufile = urlopen(url) if ufile.info().get_content_type() == 'text/html': print(ufile.read()) except IOError: print('problem reading url:', url)
Exercice
Pour vous entraîner à utiliser le système de fichiers et les commandes externes, consultez l'article Copier l'exercice spécial. Pour vous entraîner à utiliser urllib, consultez l'exercice sur l'énigme du journal.