La programmation permet d’automatiser moult tâches du quotidien y compris la collecte de fichiers disséminés sur divers serveurs.

Quotidiennement, nous avons besoin de données qui proviennent de systèmes divers (comptabilité, gestion commerciale…) et qui sont accessibles sur un réseau local ou sur internet par le biais d’une requête ou d’une connexion à un service (API, http, sFTP…).
Une des raisons qui m’ont poussé à m’intéresser à Python est que le VBA ne permet pas aisément de se connecter à un serveur sFTP…
Installer la bibliothèque externe Paramiko :
La connexion à un serveur sFTP nécessite la bibliothèque externe Paramiko. Toutes les infos sur le site de l’éditeur : https://docs.paramiko.org/en/latest/.
Pour l’installer, ouvrir une invite de commandes (CMD.exe) et entrez la séquence :
pip install paramiko
Après validation (touche Entrée), l’installation de la bibliothèque Paramiko se lance :

La bibliothèque étant installée (“Sucessfully installed…”), elle peut être appelée par un script Python à l’aide de la commande import paramiko.
Fonctionnement du script fourni ci-après :
Ce script ajoute une fonction telechargement_sftp(hostname, port, username, password, remote_path, local_path) qui rapatrie tous les fichiers contenus dans le dossier désigné par le paramètre remote_path (serveur sFTP) vers le dossier local_path (PC) après connexion sécurisée au serveur (hostname, port, username, password).
Cette fonction s’occupe passer en revue le dossier remote_path : de créer tous les sous-dossiers le cas échéant (en utilisant les propriétés de récursivité du langage Python) et de copier les fichiers contenus dans ces sous-dossiers.
Code source du script Connexion sFTP.py :
# Téléchargement de fichiers situés sur un serveur sFTP
import paramiko # bibliothèque externe sFTP
def telecharge_fichiers_sftp_recursive(sftp, remote_path, local_path):
# Liste des fichiers et dossiers dans le répertoire distant
remote_files = sftp.listdir(remote_path)
# Téléchargement de chaque fichier du répertoire distant
for remote_file in remote_files:
remote_file_path = f"{remote_path}/{remote_file}"
local_file_path = f"{local_path}\\{remote_file}"
# Vérifie si l'élément distant est un répertoire
if is_directory(sftp, remote_file_path):
# Crée le sous-dossier local si nécessaire
if not os.path.exists(local_file_path):
os.makedirs(local_file_path)
# Appelle récursivement la fonction pour traiter le sous-dossier distant
telecharge_fichiers_sftp_recursive(sftp, remote_file_path, local_file_path)
# Téléchargement du fichier
sftp.get(remote_file_path, local_file_path)
# Obtient la date de modification du fichier distant
mtime = sftp.stat(remote_file_path).st_mtime
# Définit la date de modification locale du fichier téléchargé
os.utime(local_file_path, (time.time(), mtime))
print(f"\tTéléchargé : {remote_file}")
except FileNotFoundError as e:
print(f"\tErreur : Répertoire distant introuvable. {e}")
def is_directory(sftp, remote_path):
# Liste des fichiers et dossiers dans le répertoire distant
files = sftp.listdir(remote_path)
# Si le chemin distant est un répertoire, la liste contiendra des fichiers et des sous-répertoires
# Si le chemin distant est un fichier, la liste sera vide et IOError sera levée
def telechargement_sftp(hostname, port, username, password, remote_path, local_path):
# Affichage des dossiers distant et local
print(f"Transfert des fichiers du serveur {hostname}:{port}:{remote_path} vers {local_path} :")
# Crée une instance de transport
transport = paramiko.Transport((hostname, port))
transport.connect(username=username, password=password)
sftp = paramiko.SFTPClient.from_transport(transport)
# Appelle la fonction récursive pour télécharger les fichiers SFTP de manière récursive
telecharge_fichiers_sftp_recursive(sftp, remote_path, local_path)
# Ferme la connexion SFTP
print("Transfert de fichiers sFTP :")
# Téléchargement des balances et fiches tiers
# Paramètres de connexion
hostname = 'adresse_serveur.fr'
remote_path = '/projects/benoit'
local_path = 'C:\\COLLECTE FEC & BG\\SOURCE\\benoit'
telechargement_sftp(hostname, port, username, password, remote_path, local_path)
# Paramètres de connexion
hostname = 'adresse_serveur.fr'
remote_path = '/projects/fecfiles'
local_path = 'C:\\COLLECTE FEC & BG\\SOURCE\\fecfiles'
telechargement_sftp(hostname, port, username, password, remote_path, local_path)
# Téléchargement de fichiers situés sur un serveur sFTP
# v1.0 11/2023
import os
import time
import paramiko # bibliothèque externe sFTP
def telecharge_fichiers_sftp_recursive(sftp, remote_path, local_path):
try:
# Liste des fichiers et dossiers dans le répertoire distant
remote_files = sftp.listdir(remote_path)
# Téléchargement de chaque fichier du répertoire distant
for remote_file in remote_files:
remote_file_path = f"{remote_path}/{remote_file}"
local_file_path = f"{local_path}\\{remote_file}"
# Vérifie si l'élément distant est un répertoire
if is_directory(sftp, remote_file_path):
# Crée le sous-dossier local si nécessaire
if not os.path.exists(local_file_path):
os.makedirs(local_file_path)
# Appelle récursivement la fonction pour traiter le sous-dossier distant
telecharge_fichiers_sftp_recursive(sftp, remote_file_path, local_file_path)
else:
# Téléchargement du fichier
sftp.get(remote_file_path, local_file_path)
# Obtient la date de modification du fichier distant
mtime = sftp.stat(remote_file_path).st_mtime
# Définit la date de modification locale du fichier téléchargé
os.utime(local_file_path, (time.time(), mtime))
print(f"\tTéléchargé : {remote_file}")
except FileNotFoundError as e:
print(f"\tErreur : Répertoire distant introuvable. {e}")
except Exception as e:
print(f"\tErreur : {e}")
def is_directory(sftp, remote_path):
try:
# Liste des fichiers et dossiers dans le répertoire distant
files = sftp.listdir(remote_path)
# Si le chemin distant est un répertoire, la liste contiendra des fichiers et des sous-répertoires
return True
except IOError:
# Si le chemin distant est un fichier, la liste sera vide et IOError sera levée
return False
def telechargement_sftp(hostname, port, username, password, remote_path, local_path):
# Affichage des dossiers distant et local
print("-" * 85)
print(f"Transfert des fichiers du serveur {hostname}:{port}:{remote_path} vers {local_path} :")
# Crée une instance de transport
transport = paramiko.Transport((hostname, port))
transport.connect(username=username, password=password)
# Crée une instance SFTP
sftp = paramiko.SFTPClient.from_transport(transport)
# Appelle la fonction récursive pour télécharger les fichiers SFTP de manière récursive
telecharge_fichiers_sftp_recursive(sftp, remote_path, local_path)
# Ferme la connexion SFTP
sftp.close()
# Ferme le transport
transport.close()
print()
print("-" * 85)
print("Transfert de fichiers sFTP :")
print()
# Téléchargement des balances et fiches tiers
# Paramètres de connexion
hostname = 'adresse_serveur.fr'
port = 2022
username = 'user1'
password = 'mdp1'
remote_path = '/projects/benoit'
local_path = 'C:\\COLLECTE FEC & BG\\SOURCE\\benoit'
telechargement_sftp(hostname, port, username, password, remote_path, local_path)
# Téléchargement des FEC
# Paramètres de connexion
hostname = 'adresse_serveur.fr'
port = 2022
username = 'user2'
password = 'mdp2'
remote_path = '/projects/fecfiles'
local_path = 'C:\\COLLECTE FEC & BG\\SOURCE\\fecfiles'
telechargement_sftp(hostname, port, username, password, remote_path, local_path)
# Téléchargement de fichiers situés sur un serveur sFTP
# v1.0 11/2023
import os
import time
import paramiko # bibliothèque externe sFTP
def telecharge_fichiers_sftp_recursive(sftp, remote_path, local_path):
try:
# Liste des fichiers et dossiers dans le répertoire distant
remote_files = sftp.listdir(remote_path)
# Téléchargement de chaque fichier du répertoire distant
for remote_file in remote_files:
remote_file_path = f"{remote_path}/{remote_file}"
local_file_path = f"{local_path}\\{remote_file}"
# Vérifie si l'élément distant est un répertoire
if is_directory(sftp, remote_file_path):
# Crée le sous-dossier local si nécessaire
if not os.path.exists(local_file_path):
os.makedirs(local_file_path)
# Appelle récursivement la fonction pour traiter le sous-dossier distant
telecharge_fichiers_sftp_recursive(sftp, remote_file_path, local_file_path)
else:
# Téléchargement du fichier
sftp.get(remote_file_path, local_file_path)
# Obtient la date de modification du fichier distant
mtime = sftp.stat(remote_file_path).st_mtime
# Définit la date de modification locale du fichier téléchargé
os.utime(local_file_path, (time.time(), mtime))
print(f"\tTéléchargé : {remote_file}")
except FileNotFoundError as e:
print(f"\tErreur : Répertoire distant introuvable. {e}")
except Exception as e:
print(f"\tErreur : {e}")
def is_directory(sftp, remote_path):
try:
# Liste des fichiers et dossiers dans le répertoire distant
files = sftp.listdir(remote_path)
# Si le chemin distant est un répertoire, la liste contiendra des fichiers et des sous-répertoires
return True
except IOError:
# Si le chemin distant est un fichier, la liste sera vide et IOError sera levée
return False
def telechargement_sftp(hostname, port, username, password, remote_path, local_path):
# Affichage des dossiers distant et local
print("-" * 85)
print(f"Transfert des fichiers du serveur {hostname}:{port}:{remote_path} vers {local_path} :")
# Crée une instance de transport
transport = paramiko.Transport((hostname, port))
transport.connect(username=username, password=password)
# Crée une instance SFTP
sftp = paramiko.SFTPClient.from_transport(transport)
# Appelle la fonction récursive pour télécharger les fichiers SFTP de manière récursive
telecharge_fichiers_sftp_recursive(sftp, remote_path, local_path)
# Ferme la connexion SFTP
sftp.close()
# Ferme le transport
transport.close()
print()
print("-" * 85)
print("Transfert de fichiers sFTP :")
print()
# Téléchargement des balances et fiches tiers
# Paramètres de connexion
hostname = 'adresse_serveur.fr'
port = 2022
username = 'user1'
password = 'mdp1'
remote_path = '/projects/benoit'
local_path = 'C:\\COLLECTE FEC & BG\\SOURCE\\benoit'
telechargement_sftp(hostname, port, username, password, remote_path, local_path)
# Téléchargement des FEC
# Paramètres de connexion
hostname = 'adresse_serveur.fr'
port = 2022
username = 'user2'
password = 'mdp2'
remote_path = '/projects/fecfiles'
local_path = 'C:\\COLLECTE FEC & BG\\SOURCE\\fecfiles'
telechargement_sftp(hostname, port, username, password, remote_path, local_path)
Copie écran de l’exécution du programme :
Le nom des fichiers téléchargés su serveur sFTP vers le PC est affiché à l’écran (pour des raisons de confidentialité, le nom des serveurs a été anonymisé) :

Ce script évite à l’utilisateur de télécharger manuellement les fichiers lui faisant économiser un temps précieux.

Tous les articles en rapport avec le langage Python
___
Pour approfondir le sujet : se former à la programmation en langage Python pour automatiser ses tâches
2.13.0.0
2.13.0.0
2.13.0.0
2.13.0.0
2.13.0.0
2.13.0.0
2.13.0.0
2.13.0.0
2.13.0.0
2.13.0.0
2.13.0.0
The following two tabs change content below.
Pingback: Lancer l'exécution d'un script Python à partir d'une macro VBA - Audit & Systèmes d'Information