Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
issue95:python [2015/04/22 15:17] – [8] fredphil91 | issue95:python [2015/04/24 10:46] (Version actuelle) – [9] auntiee |
---|
As my vision darkened and the three-note ominous orchestral string hits “Da Da DAAAAAAAAA” that we all know from the horror flicks of the 70’s and 80’s rang through my mind, rather than running screaming from the room, I innocently asked what was wrong. He responded that there was something wrong with one of the macros and “the thing just quits in the middle of the calculations”. As I whipped out my white cowboy hat, I said in my best hero voice “Don’t worry citizen. We’ll have you up and running in no time.” Within a short while, I discovered the reason the spreadsheet was unceremoniously crashing was that one cell in one of 35 workbooks was getting a divide by zero error due to an expected value not being entered in another cell in yet another one of the 35 workbooks. Let me make this perfectly clear, it was not my boss’s fault. All he had asked for was a simple way to get the higher-up values from the data. (The previous two sentences have absolutely nothing to do with the fact that my boss may read this article! Or maybe it does.)** | As my vision darkened and the three-note ominous orchestral string hits “Da Da DAAAAAAAAA” that we all know from the horror flicks of the 70’s and 80’s rang through my mind, rather than running screaming from the room, I innocently asked what was wrong. He responded that there was something wrong with one of the macros and “the thing just quits in the middle of the calculations”. As I whipped out my white cowboy hat, I said in my best hero voice “Don’t worry citizen. We’ll have you up and running in no time.” Within a short while, I discovered the reason the spreadsheet was unceremoniously crashing was that one cell in one of 35 workbooks was getting a divide by zero error due to an expected value not being entered in another cell in yet another one of the 35 workbooks. Let me make this perfectly clear, it was not my boss’s fault. All he had asked for was a simple way to get the higher-up values from the data. (The previous two sentences have absolutely nothing to do with the fact that my boss may read this article! Or maybe it does.)** |
| |
Tout d'abord, permettez-moi de remercier tous les lecteurs qui m'ont envoyé des courriels d'espoir et des vœux de prompt rétablissement. C'était super gentil et d'une grande aide. Je tiens également à remercier Ronnie, notre merveilleux éditeur, pour son soutien et sa patience pendant cette période douloureuse. J'ai encore des problèmes pour rester longtemps assis, du coup je rédige ceci sur plusieurs jours, et j'espère arriver à garder une certaine continuité. Maintenant, place au « spectacle »... | Tout d'abord, permettez-moi de remercier tous les lecteurs qui m'ont envoyé des courriels d'espoir et des vœux de prompt rétablissement. C'était super gentil et d'une grande aide. Je tiens également à remercier Ronnie, notre merveilleux rédacteur en chef, pour son soutien et sa patience pendant cette période douloureuse. J'ai encore des problèmes pour rester longtemps assis et du coup je rédige ceci sur plusieurs jours ; j'espère arriver à garder une certaine continuité. Maintenant, place au « spectacle »... |
| |
Il n'y a pas très longtemps, je courais après le temps et le directeur général de mon « travail de jour » m'a appelé dans son bureau. En espérant que c'était juste une conversation de style « comment ça va », je suis entré et me suis assis. Il a alors commencé par « J'ai un problème avec mon tableur, et j'espérais que vous pourriez m'aider ». | Il n'y a pas très longtemps, j'allais pointer quand le directeur général de mon « travail de jour » m'a appelé dans son bureau. En espérant que c'était juste une conversation de style « comment ça va », je suis entré et me suis assis. Il a alors commencé par : « J'ai un problème avec mon tableur, et j'espérais que vous pourriez m'aider. » |
| |
Ma vision s'est obscurci, les trois notes sinistres « Da Da DAAAAAAAAA » des films d'horreur des années 70 et 80 ont sonné dans ma tête, mais plutôt que de courir hors de la salle en hurlant, j'ai demandé innocemment quel était le problème exact. Il a répondu qu'il y avait un souci avec l'une des macros qui « s'arrêtait en plein milieu des calculs ». En revêtant mon chapeau blanc de cow-boy, j'ai dit dans ma meilleure voix héros « Ne vous inquiétez pas citoyen. Nous allons remettre ça en état en un rien de temps ». Rapidement, j'ai découvert que la raison pour laquelle la feuille de calcul plantait sans cérémonie était qu'une cellule dans l'un des 35 classeurs contenait une erreur de division par zéro parce qu'une valeur attendue n'était pas saisie dans une autre cellule dans un autre des 35 classeurs. Permettez-moi de souligner très clairement que ce n'était pas la faute de mon patron. Tout ce qu'il avait demandé était un moyen simple d'obtenir des valeurs représentatives à partir des données. (Les deux phrases précédentes n'ont absolument rien à voir avec le fait que mon patron peut lire cet article ! Ou peut-être que si.) | Ma vision s'est obscurcie et les trois notes sinistres « Da Da DAAAAAAAAA » des films d'horreur des années 70 et 80 ont sonné dans ma tête, mais plutôt que de courir hors de la salle en hurlant, j'ai demandé innocemment quel était le problème exact. Il a répondu qu'il y avait un souci avec l'une des macros qui « s'arrêtait en plein milieu des calculs ». En revêtant mon chapeau blanc de cow-boy, j'ai dit dans ma meilleure voix de héro : « Ne vous inquiétez pas citoyen. Nous allons remettre ça en état en un rien de temps. » J'ai rapidement découvert que la raison pour laquelle la feuille de calcul plantait sans cérémonie était qu'une cellule dans l'un des 35 classeurs contenait une erreur de division par zéro parce qu'une valeur attendue n'était pas saisie dans une autre cellule dans un autre des 35 classeurs. Permettez-moi de souligner très clairement que ce n'était pas la faute de mon patron. Tout ce qu'il avait demandé était un moyen simple d'obtenir des valeurs représentatives à partir des données. (Les deux phrases précédentes n'ont absolument rien à voir avec le fait que mon patron peut lire cet article ! Ou peut-être que si.) |
| |
====== 2 ====== | ====== 2 ====== |
With great power, comes great responsibility.** | With great power, comes great responsibility.** |
| |
En retournant à mon bureau, brossant les bits de code accrochés à mon chapeau blanc, j'ai réalisé que ce serait un excellent thème d'enseignement. Donc, nous voici ici. Mais d'abord, nous allons revenir à 1979, lorsque Apple a lancé Visicalc. C'était le premier « système de type formulaire libre de calcul » pour vraiment obtenir un succès sur le marché. Bien qu'il y ait de nombreux bogues dans le logiciel, le monde a adoré l'idée et les clones (bogues inclus) ont commencé à apparaître sur d'autres systèmes informatiques, comme le Commodore PET et d'autres concurrents d'Apple (y compris Microsoft en 1981 avec un programme appelé Multiplan). Enfin, en 1983, une société appelée Lotus Development Corp. introduit Lotus 1-2-3. Bien que très proche de Visicalc sur de nombreux aspects, incluant la structure des menus, il a été écrit entièrement en langage assembleur x86, qui le rendait très rapide, et de nombreux bogues de Visicalc ont été réparés. Lotus 1-2-3 était si populaire qu'il est devenu un banc de test classique pour tester la « compatibilité PC » d'une machine. | En retournant à mon bureau, brossant les faux bits de code accrochés à mon chapeau blanc, j'ai réalisé que ce serait un excellent opportunité de faire un peu d'enseignement. Et nous y sommes. Mais d'abord, nous allons revenir à 1979, lorsque Apple a lancé Visicalc. C'était le premier « système de type formulaire libre de calcul » qui a eu un vrai succès sur le marché. Bien qu'il y ait de nombreux bogues dans le logiciel, le monde a adoré l'idée et les clones (bogues inclus) ont commencé à apparaître sur d'autres systèmes informatiques, comme le Commodore PET et d'autres concurrents d'Apple (y compris Microsoft en 1981 avec un programme appelé Multiplan). Enfin, en 1983, une société appelée Lotus Development Corp. a introduit Lotus 1-2-3. Bien que très proche de Visicalc sur de nombreux aspects, y compris la structure des menus, il était écrit entièrement en langage assembleur x86, ce qui le rendait très rapide, et de nombreux bogues de Visicalc ont été corrigés. Lotus 1-2-3 était si populaire qu'il est devenu un base de référence classique pour tester la « compatibilité PC » d'une machine. |
| |
L'avènement des systèmes de formulaires libres de calculs a permis à la personne « normale » de manipuler des nombres d'une manière qui était auparavant du domaine de la programmation. Presque n'importe qui pouvait, en quelques heures, donner un sens à des nombres, créer des tableaux et des graphiques, et partager cette information avec des collègues. Peu de temps après, la capacité d'automatiser certaines parties de la feuille de calcul grâce à des macros et des langages intégrés proches du Basic a donné à ces utilisateurs non-programmeurs encore plus de pouvoir sur leur destin. Ils pouvaient obtenir les réponses eux-mêmes, et également de jolis tableaux et graphiques, sans avoir à faire la queue en attendant l'aide des informaticiens. Cependant, comme nous l'avons tous appris de l'oncle Ben de Peter Parker... | L'avènement des systèmes de formulaires libres de calculs a permis à la personne « normale » de manipuler des nombres d'une manière qui était auparavant du domaine de la programmation. Presque n'importe qui pouvait, en quelques heures, donner un sens à des nombres, créer des tableaux et des graphiques, et partager cette information avec des collègues. Peu de temps après, la capacité d'automatiser certaines parties de la feuille de calcul grâce à des macros et des langages intégrés proches du Basic a donné à ces utilisateurs non-programmeurs encore plus de pouvoir sur leur destin. Ils pouvaient obtenir les réponses eux-mêmes, et également de jolis tableaux et graphiques, sans avoir à faire la queue en attendant l'aide des informaticiens. Cependant, comme nous l'avons tous appris de l'oncle Ben de Peter Parker... |
Now as I step down from my soapbox, we come to the real reason for this month’s article. Every good Python programmer should have a way to deal with spreadsheets in their arsenal of tools. You never know when you will be called upon to pull data from a spreadsheet and manipulate it. While there are many ways to get data from spreadsheets like using CSV files, which has its own drawbacks, sometimes you need to read and write directly from and to a ‘live’ spreadsheet. After looking around, I settled on a very nice library to access my boss’s problematical spreadsheet.** | Now as I step down from my soapbox, we come to the real reason for this month’s article. Every good Python programmer should have a way to deal with spreadsheets in their arsenal of tools. You never know when you will be called upon to pull data from a spreadsheet and manipulate it. While there are many ways to get data from spreadsheets like using CSV files, which has its own drawbacks, sometimes you need to read and write directly from and to a ‘live’ spreadsheet. After looking around, I settled on a very nice library to access my boss’s problematical spreadsheet.** |
| |
Bientôt la feuille de calcul a été utilisée dans des cas qui relevaient plutôt des bases de données que des feuilles de calcul. Nous avons maintenant des classeurs sur des classeurs qui dépendent d'autres classeurs, et si un petit nombre le long du chemin n'arrive pas à se mettre à jour... et bien, nous obtenons le vieil effet « château de cartes ». | Bientôt la feuille de calcul a été utilisée dans des cas qui relevaient plutôt des bases de données que des feuilles de calcul. Nous avons maintenant des classeurs sur des classeurs qui dépendent d'autres classeurs, et si un petit nombre le long du chemin n'arrive pas à se mettre à jour... eh bien, nous obtenons le vieil effet « château de cartes ». |
| |
Je ne pense pas que toutes les feuilles de calcul sont mauvaises, mais certaines (lire ici « beaucoup ») auraient dû être converties en bases de données il y a de nombreuses années. Elles sont juste devenu trop grandes et lourdes pour leur propre bien. Si quelqu'un s'était assis avec des programmeurs et avait dit : « S'il-vous-plaît, aidez-nous », le monde serait un lieu plus gentil et plus doux. | Je ne pense pas que toutes les feuilles de calcul soient mauvaises, mais certaines (lire ici « beaucoup ») auraient dû être converties en bases de données il y a de nombreuses années. Elles sont juste devenu trop grandes et lourdes pour leur propre bien. Si quelqu'un s'était assis avec des programmeurs et avait dit : « Je vous en prie, aidez-nous », le monde serait un endroit plus empathique et plus doux. |
| |
Maintenant, je descend de ma tribune, et nous arrivons à la véritable raison de l'article de ce mois. Chaque bon programmeur Python devrait avoir parmi ses outils un moyen de traiter avec des feuilles de calcul. Vous ne savez jamais quand vous aurez besoin d'extraire des données d'une feuille de calcul pour les manipuler. Bien qu'il existe plusieurs façons de récupérer des données de feuilles de calcul, comme les fichiers CSV qui ont leurs propres inconvénients, parfois vous avez besoin de lire et d'écrire directement à partir et vers un tableur. Après avoir cherché, je suis tombé sur une très belle bibliothèque pour répondre au problème de mon patron. | Maintenant, je descend de ma tribune, et nous arrivons à la véritable raison de l'article de ce mois-ci. Chaque bon programmeur Python devrait avoir parmi ses outils un moyen de traiter avec des feuilles de calcul. Vous ne savez jamais quand vous aurez besoin d'extraire des données d'une feuille de calcul pour les manipuler. Bien qu'il existe plusieurs façons de récupérer des données de feuilles de calcul, comme les fichiers CSV qui ont leurs propres inconvénients, vous avez parfois besoin de lire et d'écrire directement à partir et vers un tableur « actif ». Après avoir cherché, je suis tombé sur une très belle bibliothèque pour accéder à la feuille de calcul problématique de mon patron. |
| |
====== 4 ====== | ====== 4 ====== |
Maintenant, sauvegardez la feuille de calcul comme « exemple1.xls » dans le dossier que vous allez utiliser pour enregistrer le code de test. De cette façon, nous n'aurons pas à nous soucier de chemins. | Maintenant, sauvegardez la feuille de calcul comme « exemple1.xls » dans le dossier que vous allez utiliser pour enregistrer le code de test. De cette façon, nous n'aurons pas à nous soucier de chemins. |
| |
Maintenant téléchargez et installer XLRD (https://pypi.python.org/pypi/xlrd). Nous pouvons l'utiliser comme illustré ci-dessous. | Maintenant téléchargez et installez XLRD (https://pypi.python.org/pypi/xlrd). Nous pouvons l'utiliser comme illustré ci-dessous. |
| |
Enregistrez le fichier sous exemple1.py dans le même dossier que la feuille de calcul. Puisque le code est très court, nous allons tout simplement en discuter ici. Bien sûr, la première ligne importe la bibliothèque. Ensuite, nous créons une fonction appelée OuvrirFichier et passons le nom (et le chemin si nécessaire) de la feuille de calcul à la fonction. | Enregistrez le fichier sous exemple1.py dans le même dossier que la feuille de calcul. Puisque le code est très court, nous allons tout simplement en discuter ici. Bien sûr, la première ligne importe la bibliothèque. Ensuite, nous créons une fonction appelée OuvrirFichier et passons le nom (et le chemin si nécessaire) de la feuille de calcul à la fonction. |
Since we already used the first four lines of code in the first example, we’ll skip them. By using the ‘sheet.nrows’ and ‘sheet.ncols’ attributes, we get the number of rows and columns. This can be helpful, not only so we know what we are dealing with; we can write “generic” routines that use those values in our calculations as you will see. In fact, we use ‘rows’ in a for loop to obtain each row’s information.** | Since we already used the first four lines of code in the first example, we’ll skip them. By using the ‘sheet.nrows’ and ‘sheet.ncols’ attributes, we get the number of rows and columns. This can be helpful, not only so we know what we are dealing with; we can write “generic” routines that use those values in our calculations as you will see. In fact, we use ‘rows’ in a for loop to obtain each row’s information.** |
| |
Maintenant, nous appelons la méthode open_workbook et récupérons un objet « classeur ». Ensuite, nous utilisons l'attribut nsheets qui retourne le nombre de feuilles actives. Nous pouvons également obtenir le nom des feuilles. Dans ce cas, ce sont ceux par défaut. Nous utilisons la méthode sheet_by_index pour obtenir la Feuille1 dans l'objet premiere_feuille. Maintenant, nous pouvons commencer à récupérer des données. Nous récupérons l'information de la cellule à la position (1,1) qui correspond à la cellule B2 (on compte à partir de 0, donc la cellule A1 serait (0,0)). Nous écrivons les données à partir de là, à la fois ce que la cellule contient et la valeur, pour que nous puissions l'utiliser dans un calcul si l'on veut. | Maintenant, nous appelons la méthode open_workbook et récupérons un objet « classeur ». Ensuite, nous utilisons l'attribut nsheets qui retourne le nombre de feuilles actives. Nous pouvons également obtenir le nom des feuilles. Dans ce cas, ce sont ceux par défaut. Nous utilisons la méthode sheet_by_index pour obtenir la Feuille1 dans l'objet premiere_feuille. Maintenant, nous pouvons commencer à récupérer des données. Nous récupérons l'information de la cellule à la position (1,1) qui correspond à la cellule B2 (on compte à partir de 0, donc la cellule A1 serait (0,0)). Nous écrivons les données à partir de là, à la fois ce que contient la cellule et la valeur, pour que nous puissions l'utiliser dans un calcul si l'on veut. |
| |
C'était vraiment facile, non ? Maintenant, nous allons faire quelque chose d'un peu plus utile. Entrez le code indiqué sur la page suivante (en haut à droite) et enregistrez-le comme « exemple2.py ». Cet exemple permet d'afficher le contenu du classeur. | C'était vraiment facile, non ? Maintenant, nous allons faire quelque chose d'un peu plus utile. Entrez le code indiqué sur la page suivante (en haut à droite) et enregistrez-le comme « exemple2.py ». Cet exemple permet d'afficher le contenu du classeur. |
| |
Nous avons déjà utilisé les quatre premières lignes de code dans le premier exemple, nous les laisserons de côté. En utilisant les attributs « sheet.nrows » et « sheet.ncols », on obtient le nombre de lignes et de colonnes. Cela peut être utile, et pas seulement pour savoir à quoi nous avons affaire ; nous pouvons écrire des routines « génériques » qui utilisent ces valeurs dans nos calculs comme vous le verrez. En fait, nous utilisons « lignes » dans une boucle for pour obtenir les informations de chaque rangée. | Nous avons déjà utilisé les quatre premières lignes de code dans le premier exemple, nous les laisserons de côté. En utilisant les attributs « sheet.nrows » et « sheet.ncols », on obtient le nombre de lignes et de colonnes. Cela peut être utile, et pas seulement pour savoir à quoi nous avons affaire ; nous pouvons écrire des routines « génériques » qui utilisent ces valeurs dans nos calculs, comme vous le verrez. En fait, nous utilisons « lignes » dans une boucle for pour obtenir les informations de chaque ligne. |
| |
====== 6 ====== | ====== 6 ====== |
X = premiere_feuille.row_slice(Ligne_Concernée, Colonne_Départ, Colonne_Fin) | X = premiere_feuille.row_slice(Ligne_Concernée, Colonne_Départ, Colonne_Fin) |
| |
Nous avons donc utilisé le nombre de lignes et le nombre de colonnes dans les calculs. La sortie de notre programme devrait ressembler à quelque chose comme ça… | Nous avons donc utilisé le nombre de lignes et le nombre de colonnes dans les calculs. La sortie de notre programme devrait ressembler à quelque chose comme çeci… |
| |
Il y a 5 lignes dans cette feuille. | Il y a 5 lignes dans cette feuille. |
Appuyez sur une touche pour continuer... | Appuyez sur une touche pour continuer... |
| |
Nous allons voir un exemple de plus avant de terminer l'article de ce mois. Allez sur la feuille de calcul et placez quelques dates dans la colonne C. Voici à quoi ma feuille de calcul ressemble maintenant : | Nous allons voir un exemple de plus avant de terminer cet article. Allez sur la feuille de calcul et placez quelques dates dans la colonne C. Voici à quoi ma feuille de calcul ressemble maintenant : |
| |
====== 7 ====== | ====== 7 ====== |
Hopefully, I’ll see you next month.** | Hopefully, I’ll see you next month.** |
| |
Juste pour votre information, les mêmes merveilleuses personnes ont fait une autre bibliothèque appelée XLWT, qui vous permet d'écrire dans des fichiers Excel. Il y a un tutoriel merveilleux et une documentation sur ces deux bibliothèques ici : http://www.python-excel.org/. | Juste pour information, les mêmes merveilleuses personnes ont fait une autre bibliothèque appelée XLWT, qui vous permet d'écrire dans des fichiers Excel. Il y a un tutoriel merveilleux et une documentation sur ces deux bibliothèques ici : http://www.python-excel.org/. |
| |
Le code source de exemple3.py est sur pastebin : http://pastebin.com/EciU3Fak. | Le code source de exemple3.py est sur pastebin : http://pastebin.com/EciU3Fak. |