Skip to content

La vie rêvée d’Akim

…ou le zèbre qui voulait être un homme

  • Style de vie
  • Informatique
  • Photographie
  • Musique
  • English (US)English (US)
  • FrançaisFrançais

Catégorie : Informatique

Python: Télécharger un fichier zip et extraire une URL d’un fichier texte

Posted on samedi 8 octobre 2022 - samedi 8 octobre 2022 by Akim

Salut la foule. Ca fait un bail… Me revoilà sur Home Assistant, et je cherche des solutions à différents problèmes.

L’un d’eux est que l’intégration Meteo Suisse ne fonctionne pas. J’ai donc commencé à creuser pour savoir si je pourrais résoudre le problème.

La base publique suisse opendata.swiss met à disposition le fichier des données à 10 minutes pour la météo en Suisse. Toutefois, le fichier ne contient pas directement les données. Il s’agit d’un fichier ZIP qui contient un fichier TXT qui lui contient le lien vers le fichier CSV. Pourquoi faire simple quand on peut faire compliqué.

Je partage donc ici mes trouvailles au cas où ça pourrait servir à quelqu’un.

En résumé, j’ai besoin de:

  1. Télécharger un fichier ZIP
  2. En extraire le fichier texte qui contient l’URL vers le fichier CSV
  3. Récupérer le lien vers le fichier CSV

On commence par importer les modules qui nous seront utiles:

from io import BytesIO
from zipfile import ZipFile
import requests
import re
import sys
  • ByteIO permet d’ouvrir un fichier binaire en mémoire. Ca permet de ne pas écrire le fichier sur le disque
  • zipfile a un nom assez parlant. Il permet de gérer … Ouiiii bravoooo, les fichiers ZIP
  • requests va nous permettre de faire une requête pour télécharger le fichier
  • re permettra de rechercher les info qui correspondent à l’expression régulière proposée (ici, une URL)
  • and sys me sert à quitter le script en spécifiant un code d’erreur. Même si ici, il n’y a pas grand chose à spécifier. Mais on peut si on veut…

Ensuite, on définit les variables nécessaires à ce script.

  • url contiendra le lien vers le fichier ZIP. On suppose que ce lien est connu
  • filestr contiendra un mot clé permettant d’identifier le fichier texte à extraire, considérant bien sûr qu’on en connaît au moins une partie. Ici, le nom du fichier à extraire contient les lettres URL
  • urlstr permettra de localisé l’URL contenant la clé que l’on recherche. Dans mon cas, la clé est csv puisque je recherche un lien vers un fichier CSV
  • regularex est une expression régulière (trouvée sur le net) qui permettra d’extraire les URL du fichier texte
url = "https://whateverurlyouneed"
# Define string to be found in the file name to be extracted
filestr = "anystring"
# Define string to be found in URL to parse
urlstr = "anyotherstring"
# Define regex to extract URL
regularex = r"(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|(([^\s()<>]+|(([^\s()<>]+)))))+(?:(([^\s()<>]+|(([^\s()<>]+))))|[^\s`!()[]{};:'\".,<>?«»“”‘’]))"

La prochaine étape consiste à télécharger le fichier ZIP et l’enregistrer dans une variable “content”:

content = requests.get(url)

Puis charger le fichier ZIP en mémoire:

zipfile = ZipFile(BytesIO(content.content))

De là, on va extraire le fichier texte dont le nom contient la clé contenue dans la variable filestr, souvenez-vous dans mon cas, “URL”. Nous allons ouvrir ce fichier et inscrire son contenu dans une variable appelée “data”:

data = [zipfile.open(file_name) for file_name in zipfile.namelist() if filestr in file_name][0]

Enfin, nous allons lire chaque ligne de cette variable, et en extraire les URL contenant la clé “csv”. Puis nous arrêterons la boucle à la première occurrence.

for line in (line for line in data.readlines() if urlstr in line.decode("latin-1")):
    urls = re.findall(regularex,line.decode("latin-1"))
    print([url[0] for url in urls])
    break

On finit par sortir du script avec un code d’erreur 0.

sys.exit(0)

Voici donc le script complet:

#!/bin/env python
from io import BytesIO
from zipfile import ZipFile
import requests
import re
import sys
# define url value
url = "https://whateverurlyouneed"
# Define string to be found in the file name to be extracted
filestr = "anystring"
# Define string to be found in URL
urlstr = "anyotherstring"
# Define regex to extract URL
regularex = r"(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|(([^\s()<>]+|(([^\s()<>]+)))))+(?:(([^\s()<>]+|(([^\s()<>]+))))|[^\s`!()[]{};:'\".,<>?«»“”‘’]))"
# download zip file
content = requests.get(url)
# Open stream
zipfile = ZipFile(BytesIO(content.content))
# Open first file from the ZIP archive containing 
# the filestr string in the name
data = [zipfile.open(file_name) for file_name in zipfile.namelist() if filestr in file_name][0]
# read lines from the file. If csv found, print URL and exit
# This will return the 1st URL containing CSV in the opened file
for line in (line for line in data.readlines() if urlstr in line.decode("latin-1")):
    urls = re.findall(regularex,line.decode("latin-1"))
    print([url[0] for url in urls])
    break
sys.exit(0)
Posted in InformatiqueLeave a comment

Extensions WordPress et migraine

Posted on vendredi 25 octobre 2019 - vendredi 25 octobre 2019 by Akim

Bien sûr, il est l’heure de dormir, et je suis sur mon blog à chercher pourquoi diable certains de mes articles ne s’affichent plus.

Et devinez quoi ! C’est la faute à deux extensions obsolètes et non maintenues… Et je dois maintenant éditer tous mes articles pour remplacer les shortcodes par ceux d’autres extensions… Je hais l’informatique. Je vais vraiment finir par partir élever des moutons à la montagne.

Bref… soyez patient, je m’occuperai de cette “réparation” bientôt. un jour… et je trouverai un moyen de le faire en masse…

D’ici là, passez une bonne nuit

Posted in InformatiqueLeave a comment

HASS: Déploiement et mise à jour de Home Assistant dans un container depuis Docker Hub

Posted on lundi 15 janvier 2018 - lundi 15 janvier 2018 by Akim

Déploiement et mise à jour de Home Assistant dans un container Docker

Introduction

J’utilise maintenant Home Assistant, un serveur domotique Open Source, depuis quelques semaines. Et pour rester dans la simplicité, j’ai décidé de le déployer depuis Docker Hub, dans un container. C’est plutôt nouveau pour moi, et j’aime beaucoup. Ca facilite beaucoup les choses. Continue reading “HASS: Déploiement et mise à jour de Home Assistant dans un container depuis Docker Hub” →

Posted in InformatiqueTagged docker, home assistant5 Comments

Script: Créer un dépôt Github automatiquement en local et en distant

Posted on dimanche 14 janvier 2018 - lundi 15 janvier 2018 by Akim

Je me suis donc mis à Github. Voilà qui va me simplifier la vie. J’ai trouvé la prise en main assez difficile jusqu’à ce qu’un collègue partage le lien de cette excellente petite formation en ligne créée par Code School et sponsorisée par Github: https://try.github.io/. Je vous la recommande vivement.

J’ai pris un abonnement Github car je voulais pouvoir avoir des dépôts privés, ce qui n’est pas possible avec un compte gratuit. Et comme je suis un flemmard, j’ai créé un script qui crée pour moi un nouveau dossier, l’initialise avec git, crée un dépôt sur github et lie les deux. Le script est commenté. Et il est disponible sur… github bien sûr, sur mon dépôt Useful-Scripts https://github.com/Superkikim/Useful-Scripts. Ce dépôt est public. N’hésitez pas à partager, et profitez-en. Continue reading “Script: Créer un dépôt Github automatiquement en local et en distant” →

Posted in InformatiqueTagged bash, script, githubLeave a comment

Vérifier par script bash si la connexion ssh fonctionne

Posted on jeudi 11 janvier 2018 - jeudi 6 juin 2019 by Akim

En partant à la découverte de Nutanix Calm, je cherche à scripter le maximum du choses, forcément. Aussi, j’ai cherché comment vérifier si une connexion ssh fonctionnait correctement en script, pour permettre à celui-ci de lancer une action ou de s’interrompre si ce n’est pas le cas. Voici ce que ça donne:
 
Remplacez bien sûr les éléments , et par vos besoin.

Ce script va lancer une requête SSH, et sortir immédiatement. Il ne va pas contrôler la clé de host, ceci permet que le script ne s’interrompe pas pour demander oui/non (fingerprint). On renvoie ensuite le résutat vers /dev/null, comme ça c’est totalement silencieux. Puis on récupère enfin le code de sortie. S’il est 0, c’est bon. Si il est autre chose, la connexion a échoué, et on arrête le script.

Une erreur 255 indique par contre un access denied. On peut donc considérer qu’en tel cas, la connexion fonctionne. Donc si vous souhaitez savoir si un utilisateur peut s’authentifier, 255 est un échec. Si vous souhaitez juste savoir si SSH accepte les connexions, 255 peut être considéré comme un succès.

# Silently check if ssh connection is working for new user
ssh -q -o "StrictHostKeyChecking no" @ -p  exit &> /dev/null
ret_code=$?

# If connection failed, stop the script
if [ $ret_code != 0 ] && [ $ret_code != 255 ]
then
   echo "SSH connection for user  failed. Stopping script. Error code $ret_code"
   exit $ret_code
fi

Posted in InformatiqueTagged AutomatisationLeave a comment

MaxSmart Power Station: Fabriquant, modèles similaires et APIs

Posted on dimanche 17 décembre 2017 - mardi 20 juillet 2021 by Akim

J’ai continué mes recherches sur les prises MaxSmart. J’ai découvert, grâce aux MAC Address (adresse matérielle des composants réseau)

Continue reading “MaxSmart Power Station: Fabriquant, modèles similaires et APIs” →

Posted in InformatiqueTagged domotique, maxsmart32 Comments

MaxSmart/Revogi – Prise multiple automatisable et RestAPI

Posted on dimanche 3 décembre 2017 - dimanche 17 décembre 2017 by Akim

J’ai récemment acheté plusieurs prises multiples MaxSmart de Max Hauri. Digitec a fait une offre exceptionnelle à CHF 75.00 pour la Power Station (multiprise six sockets).

C’est un produit intéressant à plus d’un titre. La multiprise elle-même comporte un port RJ45. Une fois branchée sur le routeur réseau, elle crée un réseau PowerLAN 500Mb/s. Il est dès lors possible de contrôler jusqu’à 15 périphériques MaxSmart dans la maison, à condition que l’on soit, bien entendu, derrière le même compteur électrique. Il s’agit ici d’une limitation PowerLAN, et non MaxSmart. Il est ensuite possible de contrôler et d’automatiser chaque prise depuis son téléphone mobile ou depuis internet.

Continue reading “MaxSmart/Revogi – Prise multiple automatisable et RestAPI” →

Posted in Informatique13 Comments

Même site, plusieurs login dans Firefox

Posted on mercredi 8 novembre 2017 by Akim

Depuis deux mois, j’ai rejoint la société Nutanix. Je passe sur les détails pour l’instant, je ferai peut-être des articles sur le sujet dans le futur. Ici n’est pas l’objet.

Depuis deux mois, je galère avec:

  • Deux sessions web Whatsapp
    • Une sur mon numéro de mobile privé
    • Une sur mon numéro de mobile professionnel
  • Deux sessions Google (même chose)
  • Deux sessions Facebook, Twitter, etc…

Continue reading “Même site, plusieurs login dans Firefox” →

Posted in InformatiqueLeave a comment

Suppression bannière SSH DD-WRT

Posted on samedi 28 janvier 2017 - samedi 28 janvier 2017 by Akim

Dans le cadre de scripts d’automatisation que je suis en train de préparer, j’exécute des commandes SSH à distance sur mon routeur WIFI piloté par DD-WRT. Ceci peut être utile pour la domotique par exemple, ou le monitoring de l’activité Wifi.

Pour ceux qui ne le connaissent pas, DD-WRT est un firmware Open Source pour routeur. A la base, il a été créé pour remplacer le firmware des WRT-54G de Linksys. Puis il s’est étendu à tout une liste de routeurs dont on retrouve la base de donnée sur le site dédié. On trouve des firmwares similaires tels que Open-WRT, ou Tomato. Tous ont leurs avantages, leurs inconvénients. J’ai choisi DD-WRT depuis plusieurs années. Continue reading “Suppression bannière SSH DD-WRT” →

Posted in InformatiqueLeave a comment

Envoyer un email depuis Debian (ou Ubuntu)

Posted on jeudi 26 janvier 2017 by Akim

Pour envoyer un email depuis le terminal ou un script sur Debian, on peut utiliser mailx.

Créer un fichier .mailrc dans le dossier home de l’utilisateur. Dans cet exemple, j’utilise un compte gmail et le serveur smtp gmail à authentification TLS. Continue reading “Envoyer un email depuis Debian (ou Ubuntu)” →

Posted in InformatiqueLeave a comment

Protégez vos données, les cartes SD et microSD ne sont pas fiables

Posted on jeudi 25 août 2016 by Akim

Carte SD (Secure Digital) et MicroSD .. Secure… Vraiment ?

Voici mon expérience et quelques conseils pour avoir l’esprit tranquille Continue reading “Protégez vos données, les cartes SD et microSD ne sont pas fiables” →

Posted in InformatiqueLeave a comment

Supprimer des fichiers redondants avec des extensions différentes

Posted on samedi 6 août 2016 by Akim

Dur de trouver un titre adéquat pour cet article. Voici de quoi il s’agit. je fais de la photographie. Mon appareil enregistre un fichier RAW et un fichier JPG pour chaque prise de vue. Continue reading “Supprimer des fichiers redondants avec des extensions différentes” →

Posted in InformatiqueTagged bash, linux, scriptLeave a comment

Navigation des articles

Articles plus anciens
Proudly powered by WordPress | Theme: micro, developed by DevriX.