Skip to content

Instantly share code, notes, and snippets.

@wuriyanto48
Last active November 9, 2021 17:05
Show Gist options
  • Save wuriyanto48/d1e8ebcb2759c30218afe95954f4505c to your computer and use it in GitHub Desktop.
Save wuriyanto48/d1e8ebcb2759c30218afe95954f4505c to your computer and use it in GitHub Desktop.
Download file From FTP Server with Python
import ftplib
import socket
from pathlib import Path
class MyFTP_TLS(ftplib.FTP_TLS):
"""Explicit FTPS, with shared TLS session"""
def ntransfercmd(self, cmd, rest=None):
conn, size = ftplib.FTP.ntransfercmd(self, cmd, rest)
if self._prot_p:
conn = self.context.wrap_socket(conn,
server_hostname=self.host,
session=self.sock.session) # this is the fix
return conn, size
HOSTNAME = "ftp.yourdomain.com"
PORT = 9999
USERNAME = "yourusername"
PASSWORD = "yourpassword"
FILE_NAME = 'file_to_be_download.csv'
# Connect FTP Server
ftp_server = MyFTP_TLS()
# ftp_server.set_debuglevel(2)
connect_r = ftp_server.connect(HOSTNAME, PORT)
print('connection status: ', connect_r)
login_s = ftp_server.login(USERNAME, PASSWORD)
print('login status: ', login_s)
data_conn_s = ftp_server.prot_p()
print('data conn status: ', data_conn_s)
ftp_server.set_pasv(True)
ftp_server.encoding = "utf-8"
print('workdir: ', ftp_server.pwd())
# cwd_s = ftp_server.cwd("/")
# print('change dir status: ', cwd_s)
ftp_server.af = socket.AF_INET6
# download single file
# with open(FILE_NAME, "wb") as file:
# retr_s = ftp_server.retrbinary(f"RETR {FILE_NAME}", file.write)
# print('retrive status: ', retr_s)
# download multiple file
list_file = ftp_server.nlst()
for f in list_file:
if Path(f).exists():
print(f'file already exist {f}')
else:
with open(f, "wb") as file:
retr_s = ftp_server.retrbinary(f"RETR {f}", file.write)
print('retrive status: ', retr_s)
# Close the Connection
ftp_server.quit()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment