Outils pour utilisateurs

Outils du site


issue196:python

Greetings fellow beings. It’s already the end of summer (well, here where I live), and it can’t come soon enough. Days with highs of over 107° F (42° C) air temperature in the shade for over 30 days in a row with no rain at all, plays havoc with simple tasks of everyday life like mowing the grass, going to the grocery, and simply taking a walk – a real task that is dangerous for many people. Luckily, with the beginning of Fall, that should come to an end. Anyway, about this month’s project. A few years ago, my son asked for a way for him to watch television on his computer without having to get a cable drop in his home office, or having to purchase another television. Here in the U.S., we have OTA (Over The Air) television that is free from the local stations. All you need is an antenna and a TV that has a tuner. That’s pretty easy to do, since most televisions have tuners built into them, and I have an antenna that’s designed for indoor installation. I use that for the television in the living room.

Salutations, chers amis. C'est déjà la fin de l'été (enfin, là où je vis), et cela ne pourrait arriver plus tôt. Des journées avec des températures maximales de plus de 107° F (42° C) à l'ombre pendant plus de 30 jours d'affilée sans la moindre pluie, cela nuit aux tâches simples de la vie quotidienne comme tondre le gazon, aller à l'épicerie, et simplement se promener - une tâche réelle qui est dangereuse pour beaucoup de gens. Heureusement, le début de l'automne devrait mettre fin à cette situation.

Quoi qu'il en soit, parlons du projet de ce mois-ci. Il y a quelques années, mon fils m'a demandé s'il pouvait regarder la télévision sur son ordinateur sans avoir à installer une prise de câble dans son bureau ou acheter un autre téléviseur. Ici, aux États-Unis, nous avons la télévision OTA (Over The Air) qui est gratuite pour les stations locales. Tout ce dont vous avez besoin, c'est d'une antenne et d'un téléviseur équipé d'un tuner. C'est assez facile à faire, car la plupart des téléviseurs ont des tuners intégrés, et j'ai une antenne conçue pour être installée à l'intérieur. Je l'utilise pour la télévision du salon.

After a little research, I found a device called HDHomeRun that holds multiple tuners and when plugged into an ethernet cable and an antenna, will send the OTA signals to any computer that is connected to the home network. Where we are located, we can get over 80 channels of television shows throughout the house, and any computer or smartphone in the house can watch any show while others can watch something else. This is great for my son, since his computer in his office has three monitors and runs Windows. The great news is that there are viewers for Android, IOS, Windows and Mac. The bad news is that Linux is not supported for the viewers. So one of my current projects is to create a Linux based viewer (that can also work on Mac and Windows), written of course in Python (and Tkinter for the UI). The device has an API built in that you can query to get various information for things like the channel lineup and the EPG (Electronic Program Guide) – all of which comes in JSON format (as well as other formats) to find out what you want to watch, and then you simply use the VLC or MPV python plugins to view the stream.

Après quelques recherches, j'ai trouvé un appareil appelé HDHomeRun qui contient plusieurs tuners et qui, branché sur un câble Ethernet et une antenne, enverra les signaux OTA à n'importe quel ordinateur connecté au réseau domestique. Là où nous sommes, nous pouvons recevoir plus de 80 chaînes de télévision dans toute la maison, et n'importe quel ordinateur ou smartphone dans la maison peut regarder n'importe quelle émission pendant que d'autres regardent autre chose. C'est une bonne chose pour mon fils, car l'ordinateur de son bureau est équipé de trois moniteurs et fonctionne sous Windows. La bonne nouvelle, c'est qu'il existe des visionneuses pour Android, IOS, Windows et Mac. La mauvaise nouvelle, c'est que Linux n'est pas pris en charge par les visionneuses.

L'un de mes projets actuels consiste donc à créer une visionneuse basée sur Linux (qui peut également fonctionner sur Mac et Windows), écrite bien sûr en Python (et Tkinter pour l'interface utilisateur). L'appareil dispose d'une API intégrée que vous pouvez interroger pour obtenir diverses informations telles que la liste des chaînes et l'EPG (Electronic Program Guide- Guide numérique des programmes) - le tout au format JSON (ainsi que d'autres formats) pour savoir ce que vous voulez regarder, et il vous suffit ensuite d'utiliser les plugins python VLC ou MPV pour visualiser le flux.

When you query the API for the channel list, the JSON data looks something like that shown above. That’s easy enough to deal with in Python, but when you get to over 80 channels, that’s a bunch of data and the EPG is even worse. Of course, the number of data fields for each channel can change depending if the channel is High Definition, HEVC (the new ATSC format the U.S. is moving to), if the channel is marked as a Favorite channel, and so on. But visualizing this data is hard when it is in the flat format that comes in directly from the API. Especially, if you don’t have much in the way of documentation so you can write a program to handle all the possible values. It would be so much easier to see the data like this (next page, top right). Even if there are over 80 sets of the data, you can find what you want to, especially if there is something unexpected that came down in the stream. Yes, you can send the data to a file and hand break it down, but python gives us a tool to do all that.

Lorsque vous interrogez l'API pour obtenir la liste des chaînes, les données JSON ressemblent à l'illustration ci-dessus.

C'est assez facile à gérer en Python, mais lorsque vous avez plus de 80 chaînes, cela fait beaucoup de données et l'EPG est encore pire. Bien sûr, le nombre de champs de données pour chaque chaîne peut changer selon que la chaîne est en haute définition, en HEVC (le nouveau format ATSC vers lequel les États-Unis se dirigent), que la chaîne est marquée comme chaîne favorite, etc. Mais il est difficile de visualiser ces données lorsqu'elles sont dans un format plat provenant directement de l'API. En particulier, si vous ne disposez pas d'une documentation suffisante pour écrire un programme permettant de gérer toutes les valeurs possibles. Il serait tellement plus facile de voir les données comme ceci (page suivante, en haut à droite).

Même s'il y a plus de 80 jeux de données, vous pouvez trouver ce que vous voulez, surtout si quelque chose d'inhabituel arrive en cours de route. Oui, vous pouvez envoyer les données dans un fichier et les décomposer à la main, mais Python nous propose un outil pour faire tout ça.

Enter PPRINT. It’s part of the standard library set and many of us have used it, but not necessarily to the full effectiveness of the library. Let’s look at the basic syntax for pprint. class pprint.PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, compact=False, sort_dicts=True, underscore_numbers=False) There are a number of parameters that are helpful, but without any context, you might not know how to leverage them for the best results. I’ll try to break down each of them. Indent - Default = 1 - The number of spaces added for each level. Width - Default = 80 - The number of characters per line for the output. If the data can’t fit in the space allowed, the library will make a best effort.

C'est là que PPRINT devient utile. Il fait partie de la bibliothèque standard et beaucoup d'entre nous l'ont utilisé, mais pas nécessairement avec toute l'efficacité de la bibliothèque.

Examinons la syntaxe de base de pprint.

class pprint.PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, compact=False, sort_dicts=True, underscore_numbers=False)

Un certain nombre de paramètres sont utiles, mais, sans contexte, vous risquez de ne pas savoir comment les utiliser pour obtenir les meilleurs résultats. Je vais essayer de décomposer chacun d'entre eux.

Indent - Par défaut = 1 - Le nombre d'espaces ajoutés pour chaque niveau.

Width (Largeur) - Par défaut = 80 - Le nombre de caractères par ligne pour la sortie. Si les données ne peuvent pas tenir dans l'espace autorisé, la bibliothèque fera de son mieux.

Depth - Default - None - The number of nested levels for the formatted output. If the number is too low, the next level will be replaced with “…” Stream - Default = sys.stdout - This is a file-like object that will be written to by the write function of the class. If stream and sys.stdout are both None, pprint will simply return nothing. Compact - Boolean - This determines how long structures like tuples, lists, sets, etc, should be formatted. If False, the structure is broken into separate lines. If True, the structure will be output as single lines – up to width constraints. Sort_dicts - Boolean - If True (default), dictionaries will be sorted by their keys, otherwise they will be displayed in the insertion order.

Depth (Profondeur) - Par défaut - None (Aucune) - Le nombre de niveaux imbriqués pour la sortie formatée. Si le nombre est trop faible, le niveau suivant sera remplacé par « … ».

Stream - Défaut = sys.stdout - Il s'agit d'un objet de type fichier qui sera écrit par la fonction write de la classe. Si stream et sys.stdout sont tous deux None, pprint ne renverra rien.

Compact - Booléen - Ceci détermine comment les structures longues comme les tuples, les listes, les ensembles, etc. doivent être formatées. Si False, la structure est découpée en lignes séparées. Si True, la structure sera affichée sur une seule ligne, dans la limite des contraintes de largeur.

Sort_dicts - Booléen - Si True (par défaut), les dictionnaires seront triés par leurs clés, sinon ils seront affichés dans l'ordre d'insertion.

Underscore_numbers - If True, integers will have the underscore ( _ ) character as a thousands separator. If False (default), underscores won’t be printed. There are also two methods that control the formatted data output. Pprint.pformat - Returns a formatted object as a string. The syntax is: output=pprint.pformat(dataobject,*args) Pprint.pp - Prints the formatted dataobject followed by a newline character. pprint.pp(dataobject,*args) Pprint.pprint - Prints the formatted dataobject on stream followed by a newline character. If stream is None, sys.stdout is used. pprint.pprint(dataobject, stream, *args)

Underscore_numbers (Nombres souslignés)- Si True, les nombres entiers auront le caractère underscore ( _ ) comme séparateur de milliers. Si False (par défaut), les caractères de soulignement ne seront pas imprimés.

Il existe également deux méthodes qui contrôlent la sortie des données formatées.

Pprint.pformat - Renvoie un objet formaté sous forme d'une chaîne de caractères. La syntaxe est la suivante :

output=pprint.pformat(dataobject,*args)

Pprint.pp - Imprime l'objet de données formaté suivi d'un caractère de retour à la ligne.

pprint.pp(dataobject,*args)

Pprint.pprint - Imprime l'objet de données formaté d'un seul jet suivi d'un caractère de retour à la ligne. Si stream est None, sys.stdout est utilisé.

pprint.pprint(dataobject, stream, *args)

Real World Examples All of this information is wonderful, but without seeing the parameters in action, it really doesn’t help. So here we go (next few pages). I’m going to concentrate on the .pformat method in the following examples. The width parameter is fairly easy to understand, so I won’t bore you with it. That’s it for this time. I didn’t bother to set up a repository since the data would be fairly large and useless to anyone but me. I’m sure you can handle things from here. Until next time, as always; stay safe, healthy, positive and creative!

Exemples concrets

Toutes ces informations sont merveilleuses, mais sans voir les paramètres en action, elles ne sont d'aucune utilité. Nous commencerons à le faire donc (pages suivantes). Je vais me concentrer sur la méthode .pformat dans les exemples suivants. Le paramètre width est assez facile à comprendre, je ne vous ennuierai donc pas avec lui.

C'est tout pour cette fois-ci. Je n'ai pas pris la peine de mettre en place un dépôt car les données seraient assez volumineuses et inutiles pour tout autre que moi. Je suis sûr que vous pouvez gérer les choses à partir d'ici.

Jusqu'à la prochaine fois, comme toujours, restez en sécurité, en bonne santé, positifs et créatifs !

Lignes noires des encadrés : p 25, à gauche Returns: Renvoie

The same data with compact=False will return Avec les mêmes données et compact=False, le retour sera

p 25, à droite en bas Notice the highlighted line. There it is. For most Americans, this looks strange and would probably not be used. For the rest of the world, it’s a nice option to have. Faites attention à la ligne surlignée. La voilà. Pour la plupart des Américains, ça parait étrange ; ils l'ignoreraient probablement. Pour le reste du monde, c'est une belle option à avoir.

p 26 You need to be careful with this one. Using the wrong value for depth can lead to unexpected and many times useless results. Remember the default for depth is None. Soyez prudent avec ceci. L'utilisation d'une valeur erronée de profondeur peut conduire à des résultats inattendus et souvent sans intérêt. Souvenez-vous que la valeur par défaut de profondeur est None.

You can see that there are at least three levels shown, even though I did not set the depth parameter and there is a lot more data printed out. However, if I set the depth parameter to 1, check out what happens… Vous pouvez voir qu'au moins trois niveaux sont montrés, même si je n'ai pas réglé le paramètre de profondeur et un grande nombre de données est sorti. Cependant, si je régle le paramètre de profondeur à 1, regardez ce qui se passe…

That’s all that gets printed. So you can see that it’s better to specify a depth much more than you would think you would need under normal circumstances. C'est tout ce qui est imprimé. Vous pouvez donc voir que c'est mieux de spécifier une profondeur, bien plus grand que ce dont vous pourriez penser avoir besoin dans des circonstances normales.

issue196/python.txt · Dernière modification : 2023/08/29 16:54 de andre_domenech