Outils pour utilisateurs

Outils du site


issue71:python

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
issue71:python [2013/05/29 13:40] – [1] auntieeissue71:python [2013/06/07 14:32] (Version actuelle) – [15] auntiee
Ligne 60: Ligne 60:
 and so on. Now that we know what we will be looking for and where it will be, let's move on.** and so on. Now that we know what we will be looking for and where it will be, let's move on.**
  
-La structure de répertoires devrait ressembler à ceci :+La structure du répertoire devrait ressembler à ceci :
  
 émissions émissions
Ligne 88: Ligne 88:
 Which are very common extensions for video files in the media PC world.** Which are very common extensions for video files in the media PC world.**
  
-Il y a très longtemps, nous avons créé un programme pour constituer une base de données contenant nos fichiers MP3. C'était dans le n° 35, je crois, au neuvième épisode de cette série. Nous avions utilisé une routine appelée ParcourirChemin pour entrer récursivement dans tous les dossiers à partir d'un chemin de départ, et récupérer les noms de fichiers avec l'extension « .mp3 ». Nous allons réutiliser une grande partie de cette routine et la modifier pour nos besoins. Dans cette version, nous rechercherons des fichiers vidéo qui ont une des extensions suivantes :+Il y a très longtemps, nous avons créé un programme pour constituer une base de données contenant nos fichiers MP3. C'était dans le n° 35, je crois, au neuvième épisode de cette série. Nous avons utilisé une routine appelée ParcourirChemin pour entrer récursivement dans tous les dossiers à partir d'un chemin de départ, et récupérer les noms de fichiers avec l'extension « .mp3 ». Nous allons réutiliser une grande partie de cette routine et la modifier pour nos besoins. Dans cette version, nous rechercherons des fichiers vidéo qui ont une des extensions suivantes :
  
 .avi .avi
Ligne 95: Ligne 95:
 .mp4 .mp4
  
-Ce sont des extensions très communes pour les fichiers vidéo dans le monde des media PC.+Ce sont des extensions très courantes pour les fichiers vidéo dans le monde des média PC.
  
 ====== 5 ====== ====== 5 ======
Ligne 110: Ligne 110:
 As you can see, we are importing the os, sys and apsw libraries. We've used them all before. We are also importing the re library to support Regular Expressions. We'll touch on that quickly this time, but more in the next article.** As you can see, we are importing the os, sys and apsw libraries. We've used them all before. We are also importing the re library to support Regular Expressions. We'll touch on that quickly this time, but more in the next article.**
  
-Nous allons maintenant commencer avec la première partie de notre projet. Créez un fichier appelé "cherche_fichiers_tv.py​​". Veillez à bien l'enregistrer quand nous avons fini ce mois-ci, parce que nous allons repartir de là le mois prochain.+Nous allons maintenant commencer avec la première partie de notre projet. Créez un fichier appelé "cherche_fichiers_tv.py​​". Veillez à bien l'enregistrer quand nous aurons fini ce mois-ci, parce que nous allons repartir de là le mois prochain.
  
 Commençons avec nos importations : Commençons avec nos importations :
Ligne 120: Ligne 120:
 import re import re
  
-Comme vous pouvez le voir, nous importons les bibliothèques os, sys et apsw. Nous les avons toutes déjà utilisées avant. Nous importons aussi la bibliothèque re pour le support des expressions régulières. Nous allons en parler rapidement cette fois-ci, nous approfondirons dans le prochain article.+Comme vous pouvez le voir, nous importons les bibliothèques os, sys et apsw. Nous les avons toutes déjà utilisées. Nous importons aussi la bibliothèque re pour le support des expressions régulières. Nous allons en parler rapidement cette fois-ci, nous approfondirons dans le prochain article.
  
 ====== 6 ====== ====== 6 ======
Ligne 145: Ligne 145:
 Now all the dull stuff is done, so we can move on the the meat and potatoes of our project. We'll start with the MakeDataBase routine (middle right). Put it right after the imports.** Now all the dull stuff is done, so we can move on the the meat and potatoes of our project. We'll start with the MakeDataBase routine (middle right). Put it right after the imports.**
  
-Mes fichiers TV sont situés sur deux disques durs. J'ai donc créé une liste pour contenir les chemins. Si vous avez un seul endroit, vous pouvez modifier les trois lignes comme suit :+Mes fichiers TV se trouvent sur deux disques durs. J'ai donc créé une liste pour contenir les chemins. Si vous avez un seul endroit, vous pouvez modifier les trois lignes comme suit :
  
     dossierDepart = "/chemin/dossier/"     dossierDepart = "/chemin/dossier/"
Ligne 167: Ligne 167:
 for file in [f for f in files if f.endswith <nowiki>(('.avi','mkv','mp4','m4v'))]:</nowiki>** for file in [f for f in files if f.endswith <nowiki>(('.avi','mkv','mp4','m4v'))]:</nowiki>**
  
-Nous avons déjà discuté de cette routine lorsque nous avons traité le scanner MP3, donc je vais juste vous rappeler que, dans cette routine, nous vérifions pour voir si la table existeet sinon nous la créons.+Nous avons déjà discuté de cette routine lorsque nous avons traité le scanner MP3, donc je vais juste vous rappeler que, dans cette routine, nous vérifions pour voir si la table existe etsinonnous la créons.
  
 Maintenant, nous allons créer la routine ParcourirChemin (à droite, deuxième à partir du bas). Maintenant, nous allons créer la routine ParcourirChemin (à droite, deuxième à partir du bas).
  
-Lorsque nous entrons dans la routine (comme nous l'avons expliqué à l'époque), nous indiquons le chemin que nous allons parcourir. Nous vidons la variable nomEmission, que nous utiliserons plus tard, et ouvrons un fichier de log d'erreur. Ensuite, nous laissons la routine faire son boulot. Nous récupérons de l'appel (os.walk) un triplet (chemin du répertoire, noms de répertoires, noms de fichiers). Chemin du répertoire est une chaîne contenant le chemin vers le répertoire, noms de répertoire est une liste des noms des sous-répertoires dans le chemin, et noms de fichiers est une liste de noms des non-répertoires. Nous analysons ensuite la liste des noms de fichiers, pour vérifier si le nom se termine par une de nos extensions cibles.+Lorsque nous entrons dans la routine (comme nous l'avons expliqué à l'époque), nous indiquons le chemin que nous allons parcourir. Nous vidons la variable nomEmission, que nous utiliserons plus tard, et ouvrons un fichier de log d'erreur. Ensuite, nous laissons la routine faire son boulot. Nous récupérons de l'appel (os.walk) un triplet (chemin du répertoire, noms de répertoires, noms de fichiers). Chemin du répertoire est une chaîne contenant le chemin vers le répertoire, noms de répertoires est une liste des noms des sous-répertoires dans le chemin, et noms de fichiers est une liste de noms des non-répertoires. Nous analysons ensuite la liste des noms de fichiers, pour vérifier si le nom se termine par une de nos extensions cibles.
  
 for fic in [f for f in fichiers if f.endswith <nowiki>(('.avi','mkv','mp4','m4v'))]:</nowiki> for fic in [f for f in fichiers if f.endswith <nowiki>(('.avi','mkv','mp4','m4v'))]:</nowiki>
Ligne 202: Ligne 202:
 Ensuite (au milieu à droite), nous vérifions si le fichier est dans la base de données. Si c'est le cas, il ne faut pas le dupliquer. Nous vérifions simplement le nom du fichier. Nous pourrions aller plus loin et vérifier que le chemin est aussi le même, mais pour cette fois, c'est assez. Ensuite (au milieu à droite), nous vérifions si le fichier est dans la base de données. Si c'est le cas, il ne faut pas le dupliquer. Nous vérifions simplement le nom du fichier. Nous pourrions aller plus loin et vérifier que le chemin est aussi le même, mais pour cette fois, c'est assez.
  
-Si tout fonctionne correctement, la réponse de la requête ne devrait être que 1 ou 0. Si c'est 0, alors il n'est pas présent et nous allons écrire les informations dans la base de données. Sinon, nous passons à la suite. Remarquez la commande try/except au-dessus et en-dessous. Si quelque chose va mal, comme un caractère que la base n'aime pas, cela empêchera le programme de s'arrêter. Cependant, nous enregistrerons l'erreur afin que nous puissions vérifier plus tard.+Si tout fonctionne correctement, la réponse de la requête ne devrait être que 1 ou 0. Si c'est 0, alors il n'est pas présent et nous allons écrire l'information dans la base de données. Sinon, nous passons à la suite. Remarquez la commande try/except au-dessus et en-dessous. Si quelque chose va mal, comme un caractère que la base n'aime pas, cela empêchera le programme de s'arrêter. Cependant, nous enregistrerons l'erreur afin de pouvoir vérifier plus tard.
  
 ====== 11 ====== ====== 11 ======
Ligne 239: Ligne 239:
         showname = resp.group(1)**         showname = resp.group(1)**
  
-La partie re.search du code vient de la bibliothèque re. Elle utilise un modèle de chaîneet, dans ce cas, le nom du fichier que l'on veut analyser. re.M|re.I sont des paramètres qui disent que nous voulons utiliser une recherche de type multiligne (re.M) indépendante de la casse (re.I). Comme je l'ai dit précédemment, nous parlerons plus des expressions régulières le mois prochain, car notre routine correspondra à un seul type de chaîne de série/épisode. En ce qui concerne le modèle de recherche, nous recherchons : « .S » suivi de deux chiffres, suivis par « E » puis deux autres chiffres, puis un point. Si notre nom de fichier ressemblait à « tvshow.S01E03.avi », cela correspondrait. Cependant, certaines personnes codent leurs émissions ainsi : «tvshow.s01e03.avi », ou « tvshow.103.avi », ce qui rend la recherche plus difficile. Nous allons modifier cette routine le mois prochain pour couvrir la majorité des cas. Le « r' » permet qu'une chaîne brute soit utilisée pour la recherche.+La partie re.search du code vient de la bibliothèque re. Elle utilise un modèle de chaîne et, dans ce cas, le nom du fichier que l'on veut analyser. re.M|re.I sont des paramètres qui disent que nous voulons utiliser une recherche de type multiligne (re.M) indépendante de la casse (re.I). Comme je l'ai dit précédemment, nous parlerons plus des expressions régulières le mois prochain, car notre routine correspondra à un seul type de chaîne de série/épisode. En ce qui concerne le modèle de recherche, nous recherchons : « .S » suivi de deux chiffres, suivis par « E » puis deux autres chiffres, puis un point. Si notre nom de fichier ressemblait à « tvshow.S01E03.avi », cela correspondrait. Cependant, certaines personnes codent leurs émissions ainsi : «tvshow.s01e03.avi », ou « tvshow.103.avi », ce qui rend la recherche plus difficile. Nous allons modifier cette routine le mois prochain pour couvrir la majorité des cas. Le « r' » permet qu'une chaîne brute soit utilisée pour la recherche.
  
-Ensuite, la recherche retourne un objet correspondant que nous pouvons regarder. « rep » est une réponse qui est vide si aucune correspondance n'est trouvée, et, dans ce cas, deux morceaux d'information retournés. Le premier va nous donner les caractères jusqu'à la chaîne recherchée, et le second contiendra cette chaîne. Ainsi, dans le cas ci-dessus, group(1) serait « tvshow »et le second groupe serait « tvshow.S01E03. ». Ceci est spécifié par les parenthèses de la recherche « (.*) » et « (\.*) ».+Ensuite, la recherche retourne un objet correspondant que nous pouvons regarder. « rep » est une réponse qui est vide si aucune correspondance n'est trouvée, et, dans ce cas, deux morceaux d'information retournés. Le premier va nous donner les caractères jusqu'à la chaîne recherchée, et le second contiendra cette chaîne. Ainsi, dans le cas ci-dessus, group(1) serait « tvshow » et le second groupe serait « tvshow.S01E03. ». Ceci est spécifié par les parenthèses de la recherche « (.*) » et « (\.*) ».
  
-    si rep:+    si rep :
         nomEmission = rep.group(1)         nomEmission = rep.group(1)
  
Ligne 265: Ligne 265:
         episode = se[4:6]         episode = se[4:6]
  
-Ensuite, nous remplaçons tous les points de nomEmission par un espace pour les rendre plus « lisibles par l'utilisateur ».+Ensuite, nous remplaçons tous les points de nomEmission par une espacepour les rendre plus « lisibles par l'utilisateur ».
  
          nomEmission = nomEmission.replace("."," ")          nomEmission = nomEmission.replace("."," ")
Ligne 281: Ligne 281:
         return False,ret**         return False,ret**
  
-Nous créons une liste contenant le nom de l'émission, la saison et l'épisode, et la retournons avec le booléen True pour dire les choses se sont bien passées.+Nous créons une liste contenant le nom de l'émission, la saison et l'épisode, et la retournons avec le booléen True pour dire que les choses se sont bien passées.
  
         ret = [nomEmission,saison,episode]         ret = [nomEmission,saison,episode]
Ligne 313: Ligne 313:
 See you soon.** See you soon.**
  
-Voilà tout le code. Maintenant, regardons à quoi le résultat devrait ressembler. En supposant que votre structure de fichier est exactement comme la mienne, une partie de l'affichage devrait ressembler à ceci...+Voilà tout le code. Maintenant, regardons à quoi le résultat devrait ressembler. En supposant que votre structure de fichier est exactement comme la mienne, une partie de l'affichage devrait ressembler à ceci :
  
 Saison 02 Episode 04 Saison 02 Episode 04
Ligne 329: Ligne 329:
 Comme toujours, l'intégralité du code est disponible sur PasteBin.com à http://pastebin.com/p25nwCZM Comme toujours, l'intégralité du code est disponible sur PasteBin.com à http://pastebin.com/p25nwCZM
  
-La prochaine fois, nous traiterons un peu plus les formats de saison/épisodeet ferons d'autres choses pour étoffer notre programme.+La prochaine fois, nous traiterons un peu plus les formats de saison/épisode et ferons d'autres choses pour étoffer notre programme.
  
 À bientôt. À bientôt.
  
issue71/python.1369827640.txt.gz · Dernière modification : 2013/05/29 13:40 de auntiee