| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
| issue108:c_c [2016/05/07 14:24] – andre_domenech | issue108:c_c [2016/05/09 12:05] (Version actuelle) – auntiee |
|---|
| This script isn’t intended to be used as-is. You can easily adjust it to generate lists/databases of files based off filenames. This is what I’ll be focusing on in the article.** | This script isn’t intended to be used as-is. You can easily adjust it to generate lists/databases of files based off filenames. This is what I’ll be focusing on in the article.** |
| |
| Il y a quelques mois, on m'a demandé de créer une base données JSON pour l'intégrer dans une appli pour téléphone Ubuntu. Jusque-là je n'avais utilisé que des fichiers JSON, mais je ne les avais pas créés à partir de données ou de fichiers existants. J'ai alors entrepris d'utiliser Python pour lister tous les fichiers qui devraient apparaître dans l'appli afin de créer les données JSON correspondantes. Depuis ce temps, j'ai commencé à suivre un cours de gestion et d'analyse de données - dans lequel nous travaillons avec des fichiers JSON similaires. Donc dans le C&C de ce mois-ci je vais vous montrer comment j'ai écrit un nouveau script Python me permettant de créer une base de données de mes précédents articles C&C. De cette façon, il me sera facile de retrouver quand j'ai écrit un article et quel en était le sujet. | Il y a quelques mois, on m'a demandé de créer une base données JSON pour l'intégrer dans une appli pour téléphone Ubuntu. Jusque-là, je n'avais qu'utiliser des fichiers JSON, mais je ne les avais pas créés à partir de données ou de fichiers existants. J'ai alors entrepris d'utiliser Python pour lister tous les fichiers qui devraient apparaître dans l'appli afin de créer les données JSON correspondantes. Depuis ce temps, j'ai commencé à suivre un cours de gestion et d'analyse de données - dans lequel nous travaillons avec des fichiers JSON similaires. Dans le C&C de ce mois-ci, je vais donc vous montrer comment j'ai écrit un nouveau script Python me permettant de créer une base de données de mes précédents articles C&C. De cette façon, il me sera facile de retrouver la date à laquelle j'ai écrit un article ainsi que son sujet. |
| |
| Le script. | Le script. |
| |
| |
| Mais... Je n'ai pas vos articles ! | Mais... je n'ai pas vos articles ! |
| |
| Le script n'est pas fait pour être utilisé tel quel. Il peut être facilement modifié pour générer une liste/base de données de fichiers à partir de leur nom. C'est ce que je vais traiter dans cet article. | Le script n'est pas fait pour être utilisé tel quel. Il peut être facilement modifié pour générer une liste/base de données de fichiers à partir de leur nom. C'est ce que je vais traiter dans cet article. |
| Les scripts ont été testés dans Python 3.5. Des versions 3, plus anciennes, devraient fonctionner sans problème. Si vous utilisez Python 2, vous devrez corriger le code en fonction des messages d'erreur que vous recevrez. | Les scripts ont été testés dans Python 3.5. Des versions 3, plus anciennes, devraient fonctionner sans problème. Si vous utilisez Python 2, vous devrez corriger le code en fonction des messages d'erreur que vous recevrez. |
| |
| J'ai lié ma version du script avec Drive, l'outil CLI [Ndt : Command Line Interface (interface en ligne de commande)] qui gère Google Drive. Si cela ne vous intéresse pas de l'utiliser, vous pouvez tranquillement ignorer ou effacer les lignes 3-6, 26-40 et 107. Sinon, vous devrez disposer de Drive (voir les lectures complémentaires) et avoir importé subprocess.call et contextlib.contextmanager. | J'ai lié ma version du script avec Drive, l'outil CLI [Ndt : Command Line Interface (interface en ligne de commande)] qui gère Google Drive. Si son utilisation ne vous intéresse pas, vous pouvez tranquillement ignorer ou effacer les lignes 3-6, 26-40 et 107. Sinon, vous devrez disposer de Drive (voir les Lectures complémentaires) et avoir importé subprocess.call et contextlib.contextmanager. |
| |
| D'autre part, les autres importations sont nécessaires ainsi que les bibliothèques standards. | Par ailleurs, les autres importations sont nécessaires ainsi que les bibliothèques standards. |
| |
| |
| Que dois-je changer ? | Que dois-je changer ? |
| |
| Les changements suivants sont obligatoires et doivent être ajustés à votre système. Les changements optionnels se trouvent dans la prochaine section. | Les changements suivants sont obligatoires et doivent être ajustés à votre système. Les changements optionnels se trouvent dans la section suivante. |
| |
| Il faudra éditer la ligne 9 : il s'agit du fichier de destination (txtFile) pour la liste temporaire de tous les articles. | Il faudra éditer la ligne 9 : il s'agit du fichier de destination (txtFile) pour la liste temporaire de tous les articles. |
| |
| Vous devrez également éditer la ligne 13 et modifier la liste pour y indiquer les chemins que vous voulez inclure dans votre base de données. Il s'agira d'une liste donc, même si vous envisagez un chemin simple, assurez-vous de bien le mettre entre crochets. | Vous devrez également éditer la ligne 13 et modifier la liste pour y indiquer les chemins que vous voulez inclure dans votre base de données. Il s'agira d'une liste ; donc, même si vous n'envisagez qu'un seul chemin, assurez-vous de bien le mettre entre crochets. |
| |
| Si vous ne séparez pas les informations concernant vos fichiers avec des « - », il faudra modifier la ligne 70. | Si vous ne séparez pas les informations concernant vos fichiers avec des « - », il faudra modifier la ligne 70. |
| La ligne 16 contient un dictionnaire où est stockée la date du numéro 100 (August, 2015 [Ndt : août 2015]). C'est important pour les calculs dans dateFind. On ne l'a pas intégrée dans la fonction pour pouvoir la changer plus facilement. | La ligne 16 contient un dictionnaire où est stockée la date du numéro 100 (August, 2015 [Ndt : août 2015]). C'est important pour les calculs dans dateFind. On ne l'a pas intégrée dans la fonction pour pouvoir la changer plus facilement. |
| |
| La ligne 17 contient un dictionnaire vide qui est utilisé pour chaque valeur. Il aurait pu être intégré dans une méthode, mais je l'ai laissé ici pour montrer comment il fonctionne (et assurer qu'il y a -1 élément à effacer). | La ligne 17 contient un dictionnaire vide qui est utilisé pour chaque valeur. Il aurait pu être intégré dans une méthode, mais je l'ai laissé ici pour montrer comment il fonctionne (et m'assurer qu'il y a -1 élément à effacer). |
| |
| **How Does It Work? | **How Does It Work? |
| Comment cela fonctionne-t-il ? | Comment cela fonctionne-t-il ? |
| |
| Les 25 premières lignes sont essentiellement des déclarations de variables qui ont besoin d'être initialisées pour des fonctions ultérieures. La plupart se comprennent d'elles-mêmes, je ne vais donc pas m'y attarder. Les lignes 26 à 40 sont expliquées dans la partie « Drive Functions » [Ndt : les fonctions Drive]. | Les 25 premières lignes sont essentiellement des déclarations de variables qui ont besoin d'être initialisées pour des fonctions ultérieures. La plupart se comprennent d'elles-mêmes ; je ne vais donc pas m'y attarder. Les lignes 26 à 40 sont expliquées dans la partie « Drive Functions » [Ndt : les fonctions Drive]. |
| |
| Fonction : dateFind | Fonction : dateFind |
| |
| Cette fonction a été créée pour calculer le mois et l'année qui correspond à l'article. C'est important pour moi puisque certain sujets peuvent être démodés ; ainsi, si un sujet a été traité en 2012, il est peut-être temps de le réactualiser. Je le fais connaissant une date (le numéro 100 en août 2015) et la différence entre le numéro en cours et le numéro 100. Ainsi le numéro 98 me donnera une différence de 2 alors que le numéro 107 sera de -7. La différence (le nombre de fois 365/12 - en gros un mois) est alors soustrait de la date de startPoint (2015-08), et le résultat donne une nouvelle année et un mois. Les jours se décalent, mais comme FCM est une publication mensuelle ça n'a pas d'importance (et c'est même complètement supprimé avec la fonction strftime). | Cette fonction a été créée pour calculer le mois et l'année qui correspond à l'article. C'est important pour moi, puisque certains sujets peuvent être démodés ; ainsi, si un sujet a été traité en 2012, il est peut-être temps de le réactualiser. Je le fais en connaissant une date (le numéro 100 en août 2015) et la différence entre le numéro en cours et le numéro 100. Ainsi le numéro 98 me donnera une différence de 2 alors que le numéro 107 sera de -7. La différence (le nombre de fois 365/12 - en gros un mois) est alors soustrait de la date de startPoint (2015-08), et le résultat donne une année et un mois nouveaux. Les jours se décalent, mais comme FCM est une publication mensuelle ça n'a pas d'importance (et c'est même complètement supprimé avec la fonction strftime). |
| |
| On peut aussi simplement multiplier la différence par 32 - bien qu'avoir autant de jours en plus pour quelques mois peut présenter des problèmes supplémentaires. Ce n'est en aucune façon parfait ; du fait du cumul, il peut y avoir des problèmes avec les numéros de février (par exemple). | On peut aussi simplement multiplier la différence par 32 - bien qu'avoir autant de jours en plus pour quelques mois peut présenter des problèmes supplémentaires. Ce n'est en aucune façon parfait ; du fait du cumul, il peut y avoir des problèmes avec les numéros de février (par exemple). |
| Fonction : createArticleList | Fonction : createArticleList |
| |
| Cette fonction utilise os.listdir et quelques recherches regexp pour ne tenir compte que de mes articles. Puisque le titre de mes articles a toujours le format FCM100 - C&C - Titre, je m'assure simplement que le nom du fichier commence bien avec FCM[0-9]+ (un ou plusieurs nombres après FCM). Je vérifie également qu'il ne contient pas .desktop (c'est important pour Drive puisque chaque fichier est accompagné d'un .desktop). Une fois que les listes ont été ajoutées à output [Ndt : la variable de sortie], la liste n'est pas simple (elle comprend un grand nombre de sous-listes). C'est ce que résout la ligne 54. | Cette fonction utilise os.listdir et quelques recherches regexp pour ne tenir compte que de mes articles. Puisque le titre de mes articles a toujours le format FCM100 - C&C - Titre, je m'assure simplement que le nom du fichier commence bien par FCM[0-9]+ (un ou plusieurs nombres après FCM). Je vérifie également qu'il ne contient pas .desktop (c'est important pour Drive puisque chaque fichier est accompagné d'un .desktop). Une fois que les listes ont été ajoutées à output [Ndt : la variable de sortie], la liste n'est pas simple (elle comprend un grand nombre de sous-listes). C'est ce que résout la ligne 54. |
| |
| La ligne 59 supprime toutes les extensions .odt de la liste (puisque les fichiers de Google Drive n'ont pas d'extension et j'utilisais .odt au début). Enfin, j'utilise la même fonction de remplacement pour transformer les Command & Conquer en C&C - ce n'est pas absolument nécessaire mais offre une certaine uniformité. | La ligne 55 supprime toutes les extensions .odt de la liste (puisque les fichiers de Google Drive n'ont pas d'extension et que j'utilisais .odt au début). Enfin, j'utilise la même fonction de remplacement pour transformer les Command & Conquer en C&C - ce n'est pas absolument nécessaire mais offre une certaine uniformité. |
| |
| La ligne 57 vérifie qu'il n'y a pas de doublon, puisqu'un ensemble Python ne peut contenir que des valeurs uniques. Cela élimine essentiellement tout nom de fichier dupliqué. | La ligne 57 vérifie qu'il n'y a pas de doublon, puisqu'un ensemble Python ne peut contenir que des valeurs uniques. Cela élimine essentiellement tout nom de fichier dupliqué. |
| C'est le point d'orgue du fichier. Elle lit essentiellement chacune des lignes du fichier article-list.txt | C'est le point d'orgue du fichier. Elle lit essentiellement chacune des lignes du fichier article-list.txt |
| Pour chaque ligne non vide, elle exécute les étapes suivantes : | Pour chaque ligne non vide, elle exécute les étapes suivantes : |
| Découper la ligne selon le séparateur « - » (on obtient ainsi une ligne du genre ['FCM100', 'C&C', 'Title']). | • Découper la ligne selon le séparateur « - » (on obtient ainsi une ligne du genre ['FCM100', 'C&C', 'Title']). |
| Supprime le libellé FCM pour ne conserver que le numéro. | • Supprime le libellé FCM pour ne conserver que le numéro. |
| Crée une entrée, constituée d'une paire clé/valeur vide, dans le dictionnaire. | • Crée une entrée, constituée d'une paire clé/valeur vide, dans le dictionnaire. |
| Complète les informations de cette entrée (si le titre est vide - certain de mes fichiers étaient mal nommés dans le passé -, il rajoute la chaîne de caractères « Unknown » (inconnu). Elle supprime également d'éventuels caractères de saut de ligne. | • Complète les informations de cette entrée (si le titre est vide - certains de mes fichiers étaient mal nommés dans le passé -, elle rajoute la chaîne de caractères « Unknown » (inconnu). Elle supprime également d'éventuels caractères de saut de ligne. |
| DateFind est chargée de calculer une date estimée de ce numéro. | • dateFind est chargée de calculer une date estimée de ce numéro. |
| Database.update est utilisée pour ajouter (ou mettre à jour) les informations concernant le numéro courant. | • Database.update est utilisée pour ajouter (ou mettre à jour) les informations concernant le numéro courant. |
| |
| Une fois que la boucle for est terminée, le fichier est refermé, la valeur -1 de la base de données (la valeur originale de entryTemplate) est effacée et la base de données est renvoyée. | Une fois que la boucle for est terminée, le fichier est refermé, la valeur -1 de la base de données (la valeur originale de entryTemplate) est effacée et la base de données est renvoyée. |
| Fonction : write_database | Fonction : write_database |
| |
| C'est une fonction rapide qui utilise json.dumps pour simplement écrire le dictionnaire dans un fichier JSON. Il l'indente également très bien. | C'est une fonction rapide qui utilise json.dumps pour simplement écrire le dictionnaire dans un fichier JSON. Il l'indente également très bien. |
| |
| Fonction : write_csv_database | Fonction : write_csv_database |
| |
| Cette fonction utilise csv.writer pour créer un fichier CSV valide. La ligne 95 liste toutes les clés d'une entrée (typiquement, l'entrée 100). La liste est alors utilisée pour créer l'en-tête du CSV et pour s'assurer que l'ordre des valeurs est le même que celui des en-têtes et qu'ainsi tout correspond. | Cette fonction utilise csv.writer pour créer un fichier CSV valide. La ligne 95 liste toutes les clés d'une entrée (ici, l'entrée 100). La liste est alors utilisée pour créer l'en-tête du CSV et pour s'assurer que l'ordre des valeurs est le même que celui des en-têtes et qu'ainsi tout correspond. |
| |
| |
| |
| This is mainly to indicate that the function completed correctly. It’s also a useful step if you want to support error handling.** | This is mainly to indicate that the function completed correctly. It’s also a useful step if you want to support error handling.** |
| |
| |
| |
| Fonction : main | Fonction : main |
| |
| c'est un endroit où j'appelle le reste des fonctions d'aide (et les problèmes corrigés). Vous pouvez également coller cela dans la zone if__name__==«__main__» mais ma recommandation est d'avoir une fonction main permettant des importations plus simples. | C'est tout simplement un endroit où j'appelle le reste des fonctions d'aide (et les problèmes corrigés). Vous pouvez également coller cela dans la zone if__name__ =="__main__" mais ma recommandation est d'avoir une fonction main permettant des importations plus simples. |
| |
| Les fonctions Drive | Les fonctions Drive |
| |
| Fonction : CD | Fonction : cd |
| |
| Cela recrée simplement une fonction cd à partir d'un Bash, mais renvoie également vers le répertoire (directory) original, de façon à ce que la commande d'extraction du disque puisse être exécutée dans le répertoire correct, sans mélanger les écritures suivantes dans les fichiers JSON ou CSV. On la trouvait initialement dans StackOverflow (Voir les lectures complémentaires). | Cela recrée simplement une fonction cd à partir d'un Bash, mais renvoie également vers le répertoire (directory) original, de façon à ce que la commande d'extraction du disque puisse être exécutée dans le répertoire correct, sans mélanger les écritures suivantes dans les fichiers JSON ou CSV. On la trouvait initialement dans StackOverflow (voir les lectures complémentaires). |
| |
| La fonction : update_drive | La fonction : update_drive |
| |
| |
| Pourquoi est-ce que quelques fonctions renvoient True ? | Pourquoi quelques fonctions renvoient True ? |
| |
| C'est d'abord pour indiquer que la fonction s'est terminée correctement. C'est également très utile si vous voulez mettre en place un traitement des erreurs. | C'est d'abord pour indiquer que la fonction s'est terminée correctement. C'est également très utile si vous voulez mettre en place un traitement des erreurs. |
| |
| Enfin vous pouvez l'ouvrir avec un logiciel tel que Python's Pandas et l'analyser comme vous le souhaitez. | Enfin vous pouvez l'ouvrir avec un logiciel tel que Python's Pandas et l'analyser comme vous le souhaitez. |
| |
| |
| Puis-je faire des recherches ? | Puis-je faire des recherches ? |
| Vous pouvez soit ouvrir le fichier JSON et rechercher manuellement, ou l'ouvrir avec un outil quelconque d'analyse de données, ou écrire en langage Python une nouvelle fonction de recherche dans les sous-dictionnaires. | Vous pouvez soit ouvrir le fichier JSON et rechercher manuellement, ou l'ouvrir avec un outil quelconque d'analyse de données, ou écrire en langage Python une nouvelle fonction de recherche dans les sous-dictionnaires. |
| |
| J'espère que cet article présentera quelque intérêt, au moins pour un certain nombre de lecteurs. Ou, sinon, vous inspirera de nouveaux projets. Si vous avez des commentaires, suggestions ou idées d'extension, n'hésitez pas à m'envoyer un courriel à mailto:lswest34+fcm@gmail.com. | J'espère que cet article présentera quelque intérêt, au moins pour quelques lecteurs. Ou, sinon, vous inspirera de nouveaux projets. Si vous avez des commentaires, suggestions ou idées d'extension, n'hésitez pas à m'envoyer un courriel à mailto:lswest34+fcm@gmail.com. |
| |
| Lectures complémentaires | Lectures complémentaires |