{"id":12103,"date":"2024-07-29T06:44:58","date_gmt":"2024-07-29T04:44:58","guid":{"rendered":"https:\/\/www.auditsi.eu\/?p=12103"},"modified":"2024-07-23T22:22:10","modified_gmt":"2024-07-23T20:22:10","slug":"pyhton-et-sftp","status":"publish","type":"post","link":"https:\/\/www.auditsi.eu\/?p=12103","title":{"rendered":"Automatisation &#038; Python : se connecter \u00e0 un serveur sFTP et t\u00e9l\u00e9charger des fichiers"},"content":{"rendered":"<p style=\"text-align: justify;\">La programmation permet d&#8217;<strong>automatiser<\/strong> moult t\u00e2ches du quotidien y compris la <strong>collecte de fichiers<\/strong> diss\u00e9min\u00e9s sur divers serveurs.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12342\" src=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/Collecte-FEC-2024-bis.png\" alt=\"Collecte FEC 2024 bis\" width=\"783\" height=\"501\" srcset=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/Collecte-FEC-2024-bis.png 783w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/Collecte-FEC-2024-bis-300x192.png 300w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/Collecte-FEC-2024-bis-768x491.png 768w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2024\/01\/Collecte-FEC-2024-bis-730x467.png 730w\" sizes=\"auto, (max-width: 783px) 100vw, 783px\" \/><\/p>\n<p style=\"text-align: justify;\">Quotidiennement, nous avons besoin de donn\u00e9es qui proviennent de syst\u00e8mes divers (comptabilit\u00e9, gestion commerciale&#8230;) et qui sont accessibles sur un r\u00e9seau local ou sur internet par le biais d&#8217;une requ\u00eate ou d&#8217;une connexion \u00e0 un service (API, http, sFTP&#8230;).<\/p>\n<p style=\"text-align: justify;\">Une des raisons qui m&#8217;ont pouss\u00e9 \u00e0 m&#8217;int\u00e9resser \u00e0 Python est que le VBA ne permet pas ais\u00e9ment de se connecter \u00e0 un serveur sFTP&#8230;<\/p>\n<p style=\"text-align: justify;\"><strong><em>Installer la biblioth\u00e8que externe Paramiko :<\/em><\/strong><\/p>\n<p style=\"text-align: justify;\">La connexion \u00e0 un serveur sFTP n\u00e9cessite la biblioth\u00e8que externe Paramiko. Toutes les infos sur le site de l&#8217;\u00e9diteur : <a href=\"https:\/\/docs.paramiko.org\/en\/latest\/\" target=\"_blank\" rel=\"noopener\">https:\/\/docs.paramiko.org\/en\/latest\/<\/a>.<\/p>\n<p style=\"text-align: justify;\">Pour l&#8217;installer, ouvrir une invite de commandes (CMD.exe) et entrez la s\u00e9quence :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">pip install paramiko<\/pre>\n<p style=\"text-align: justify;\">Apr\u00e8s validation (touche Entr\u00e9e), l&#8217;installation de la biblioth\u00e8que Paramiko se lance :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12104\" src=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/11\/PYTHON-Install-Paramiko.png\" alt=\"PYTHON Install Paramiko\" width=\"981\" height=\"511\" srcset=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/11\/PYTHON-Install-Paramiko.png 981w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/11\/PYTHON-Install-Paramiko-300x156.png 300w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/11\/PYTHON-Install-Paramiko-768x400.png 768w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/11\/PYTHON-Install-Paramiko-730x380.png 730w\" sizes=\"auto, (max-width: 981px) 100vw, 981px\" \/><\/p>\n<p style=\"text-align: justify;\">La biblioth\u00e8que \u00e9tant install\u00e9e (&#8220;<em>Sucessfully installed<\/em>&#8230;&#8221;), elle peut \u00eatre appel\u00e9e par un script Python \u00e0 l&#8217;aide de la commande <em>import paramiko<\/em>.<\/p>\n<p style=\"text-align: justify;\"><em><strong>Fonctionnement du script fourni ci-apr\u00e8s :<\/strong><\/em><\/p>\n<p style=\"text-align: justify;\">Ce script ajoute une fonction <em>telechargement_sftp(hostname, port, username, password, remote_path, local_path)<\/em> qui rapatrie tous les fichiers contenus dans le dossier d\u00e9sign\u00e9 par le param\u00e8tre <em>remote_path<\/em> (serveur sFTP) vers le dossier <em>local_path<\/em> (PC) apr\u00e8s connexion s\u00e9curis\u00e9e au serveur (<em>hostname, port, username, password<\/em>).<\/p>\n<p>Cette fonction s&#8217;occupe passer en revue le dossier <em>remote_path<\/em> : de cr\u00e9er tous les sous-dossiers le cas \u00e9ch\u00e9ant (en utilisant les propri\u00e9t\u00e9s de r\u00e9cursivit\u00e9 du langage Python) et de copier les fichiers contenus dans ces sous-dossiers.<\/p>\n<p style=\"text-align: justify;\"><em><strong>Code source du script Connexion sFTP.py :<\/strong><\/em><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\"># T\u00e9l\u00e9chargement de fichiers situ\u00e9s sur un serveur sFTP\r\n# v1.0 11\/2023\r\n\r\nimport os\r\nimport time\r\nimport paramiko # biblioth\u00e8que externe sFTP\r\n\r\ndef telecharge_fichiers_sftp_recursive(sftp, remote_path, local_path):\r\n    try:\r\n        # Liste des fichiers et dossiers dans le r\u00e9pertoire distant\r\n        remote_files = sftp.listdir(remote_path)\r\n\r\n        # T\u00e9l\u00e9chargement de chaque fichier du r\u00e9pertoire distant\r\n        for remote_file in remote_files:\r\n            remote_file_path = f\"{remote_path}\/{remote_file}\"\r\n            local_file_path = f\"{local_path}\\\\{remote_file}\"\r\n            \r\n            # V\u00e9rifie si l'\u00e9l\u00e9ment distant est un r\u00e9pertoire\r\n            if is_directory(sftp, remote_file_path):\r\n                # Cr\u00e9e le sous-dossier local si n\u00e9cessaire\r\n                if not os.path.exists(local_file_path):\r\n                    os.makedirs(local_file_path)\r\n\r\n                # Appelle r\u00e9cursivement la fonction pour traiter le sous-dossier distant\r\n                telecharge_fichiers_sftp_recursive(sftp, remote_file_path, local_file_path)\r\n            else:\r\n                # T\u00e9l\u00e9chargement du fichier\r\n                sftp.get(remote_file_path, local_file_path)\r\n\r\n                # Obtient la date de modification du fichier distant\r\n                mtime = sftp.stat(remote_file_path).st_mtime\r\n\r\n                # D\u00e9finit la date de modification locale du fichier t\u00e9l\u00e9charg\u00e9\r\n                os.utime(local_file_path, (time.time(), mtime))\r\n\r\n                print(f\"\\tT\u00e9l\u00e9charg\u00e9 : {remote_file}\")\r\n\r\n    except FileNotFoundError as e:\r\n        print(f\"\\tErreur : R\u00e9pertoire distant introuvable. {e}\")\r\n    except Exception as e:\r\n        print(f\"\\tErreur : {e}\")\r\n\r\ndef is_directory(sftp, remote_path):\r\n    try:\r\n        # Liste des fichiers et dossiers dans le r\u00e9pertoire distant\r\n        files = sftp.listdir(remote_path)\r\n\r\n        # Si le chemin distant est un r\u00e9pertoire, la liste contiendra des fichiers et des sous-r\u00e9pertoires\r\n        return True\r\n    except IOError:\r\n        # Si le chemin distant est un fichier, la liste sera vide et IOError sera lev\u00e9e\r\n        return False\r\n\r\ndef telechargement_sftp(hostname, port, username, password, remote_path, local_path):\r\n    # Affichage des dossiers distant et local\r\n    print(\"-\" * 85)\r\n    print(f\"Transfert des fichiers du serveur {hostname}:{port}:{remote_path} vers {local_path} :\")\r\n\r\n    # Cr\u00e9e une instance de transport\r\n    transport = paramiko.Transport((hostname, port))\r\n    transport.connect(username=username, password=password)\r\n\r\n    # Cr\u00e9e une instance SFTP\r\n    sftp = paramiko.SFTPClient.from_transport(transport)\r\n\r\n    # Appelle la fonction r\u00e9cursive pour t\u00e9l\u00e9charger les fichiers SFTP de mani\u00e8re r\u00e9cursive\r\n    telecharge_fichiers_sftp_recursive(sftp, remote_path, local_path)\r\n\r\n    # Ferme la connexion SFTP\r\n    sftp.close()\r\n\r\n    # Ferme le transport\r\n    transport.close()\r\n\r\n    print()\r\n\r\n\r\nprint(\"-\" * 85)\r\nprint(\"Transfert de fichiers sFTP :\")\r\nprint()\r\n\r\n# T\u00e9l\u00e9chargement des balances et fiches tiers\r\n\r\n# Param\u00e8tres de connexion\r\nhostname = 'adresse_serveur.fr'\r\nport = 2022\r\nusername = 'user1'\r\npassword = 'mdp1'\r\nremote_path = '\/projects\/benoit'\r\nlocal_path = 'C:\\\\COLLECTE FEC &amp; BG\\\\SOURCE\\\\benoit'\r\n\r\ntelechargement_sftp(hostname, port, username, password, remote_path, local_path)\r\n\r\n# T\u00e9l\u00e9chargement des FEC\r\n\r\n# Param\u00e8tres de connexion\r\nhostname = 'adresse_serveur.fr'\r\nport = 2022\r\nusername = 'user2'\r\npassword = 'mdp2'\r\nremote_path = '\/projects\/fecfiles'\r\nlocal_path = 'C:\\\\COLLECTE FEC &amp; BG\\\\SOURCE\\\\fecfiles'\r\n\r\ntelechargement_sftp(hostname, port, username, password, remote_path, local_path)\r\n<\/pre>\n<p style=\"text-align: justify;\"><strong><em>Copie \u00e9cran de l&#8217;ex\u00e9cution du programme :<\/em><\/strong><\/p>\n<p style=\"text-align: justify;\">Le nom des fichiers t\u00e9l\u00e9charg\u00e9s su serveur sFTP vers le PC est affich\u00e9 \u00e0 l&#8217;\u00e9cran (pour des raisons de confidentialit\u00e9, le nom des serveurs a \u00e9t\u00e9 anonymis\u00e9) :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12112\" src=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/11\/Execution-Connexion-sFTP.py_.png\" alt=\"Ex\u00e9cution Connexion sFTP.py\" width=\"977\" height=\"457\" srcset=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/11\/Execution-Connexion-sFTP.py_.png 977w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/11\/Execution-Connexion-sFTP.py_-300x140.png 300w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/11\/Execution-Connexion-sFTP.py_-768x359.png 768w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/11\/Execution-Connexion-sFTP.py_-730x341.png 730w\" sizes=\"auto, (max-width: 977px) 100vw, 977px\" \/><\/p>\n<p style=\"text-align: justify;\">Ce script \u00e9vite \u00e0 l&#8217;utilisateur de t\u00e9l\u00e9charger manuellement les fichiers lui faisant \u00e9conomiser un temps pr\u00e9cieux.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12111\" src=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/11\/Filezilla.png\" alt=\"Filezilla\" width=\"1299\" height=\"794\" srcset=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/11\/Filezilla.png 1299w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/11\/Filezilla-300x183.png 300w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/11\/Filezilla-1024x626.png 1024w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/11\/Filezilla-768x469.png 768w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/11\/Filezilla-730x446.png 730w\" sizes=\"auto, (max-width: 1299px) 100vw, 1299px\" \/><\/p>\n<p style=\"text-align: justify;\">Tous les articles en rapport avec le&nbsp;<a href=\"https:\/\/www.auditsi.eu\/?tag=python\">langage Python<\/a><\/p>\n<p style=\"text-align: justify;\">___<\/p>\n<p style=\"text-align: justify;\">Pour approfondir le sujet :&nbsp;<a href=\"https:\/\/www.auditsi.eu\/?p=12059\">se former \u00e0 la programmation en langage Python pour automatiser ses t\u00e2ches<\/a><\/p>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div style=\"padding-bottom:20px; padding-top:10px;\" class=\"hupso-share-buttons\"><!-- Hupso Share Buttons - https:\/\/www.hupso.com\/share\/ --><a class=\"hupso_counters\" href=\"https:\/\/www.hupso.com\/share\/\"><img decoding=\"async\" src=\"https:\/\/static.hupso.com\/share\/buttons\/lang\/fr\/share-small.png\" style=\"border:0px; padding-top:2px; float:left;\" alt=\"Share Button\"\/><\/a><script type=\"text\/javascript\">var hupso_services_c=new Array(\"twitter\",\"facebook_like\",\"facebook_send\",\"email\",\"print\",\"linkedin\");var hupso_counters_lang = \"fr_FR\";var hupso_image_folder_url = \"\";var hupso_twitter_via=\"BenoitRiviere14\";var hupso_url_c=\"\";var hupso_title_c=\"Automatisation%20%26%20Python%20%3A%20se%20connecter%20%C3%A0%20un%20serveur%20sFTP%20et%20t%C3%A9l%C3%A9charger%20des%20fichiers\";<\/script><script type=\"text\/javascript\" src=\"https:\/\/static.hupso.com\/share\/js\/counters.js\"><\/script><!-- Hupso Share Buttons --><\/div>","protected":false},"excerpt":{"rendered":"<p>La programmation permet d&#8217;automatiser moult t\u00e2ches du quotidien y compris la collecte de fichiers diss\u00e9min\u00e9s sur divers serveurs. Quotidiennement, nous avons besoin de donn\u00e9es qui proviennent de syst\u00e8mes divers (comptabilit\u00e9, gestion commerciale&#8230;) et qui sont accessibles sur un r\u00e9seau local ou sur internet par le biais d&#8217;une requ\u00eate ou d&#8217;une connexion \u00e0 un service (API, &#8230;<\/p>\n<p><a href=\"https:\/\/www.auditsi.eu\/?p=12103\" class=\"more-link\">Continue reading &lsquo;Automatisation &#038; Python : se connecter \u00e0 un serveur sFTP et t\u00e9l\u00e9charger des fichiers&rsquo; &raquo;<\/a><\/p>\n<div style=\"padding-bottom:20px; padding-top:10px;\" class=\"hupso-share-buttons\"><!-- Hupso Share Buttons - https:\/\/www.hupso.com\/share\/ --><a class=\"hupso_counters\" href=\"https:\/\/www.hupso.com\/share\/\"><img src=\"https:\/\/static.hupso.com\/share\/buttons\/lang\/fr\/share-small.png\" style=\"border:0px; padding-top:2px; float:left;\" alt=\"Share Button\"\/><\/a><script type=\"text\/javascript\">var hupso_services_c=new Array(\"twitter\",\"facebook_like\",\"facebook_send\",\"email\",\"print\",\"linkedin\");var hupso_counters_lang = \"fr_FR\";var hupso_image_folder_url = \"\";var hupso_twitter_via=\"BenoitRiviere14\";var hupso_url_c=\"\";var hupso_title_c=\"Automatisation%20%26%20Python%20%3A%20se%20connecter%20%C3%A0%20un%20serveur%20sFTP%20et%20t%C3%A9l%C3%A9charger%20des%20fichiers\";<\/script><script type=\"text\/javascript\" src=\"https:\/\/static.hupso.com\/share\/js\/counters.js\"><\/script><!-- Hupso Share Buttons --><\/div>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"ngg_post_thumbnail":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[3087],"tags":[3103,3258,3088,434,778,2931],"class_list":["post-12103","post","type-post","status-publish","format-standard","hentry","category-python","tag-for-in","tag-paramiko","tag-python","tag-recursivite","tag-serveur","tag-sftp"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":false,"_links":{"self":[{"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/posts\/12103","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=12103"}],"version-history":[{"count":9,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/posts\/12103\/revisions"}],"predecessor-version":[{"id":12486,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/posts\/12103\/revisions\/12486"}],"wp:attachment":[{"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=12103"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=12103"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=12103"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}