SFTP File Operations with Python Using an SSH Key
Below are some functions to read, write, and delete a file, list a directory, and check if a file exists in a remote SFTP server with Python. I have written these specifically for working with CSV files and pandas data frames.
import pysftp import fnmatch import pandas as pd hostname = 'myhost' username = 'myuser' key_path = 'my_ssh_key_file.txt' cnopts = pysftp.CnOpts() cnopts.hostkeys = None
The argument file in the functions below should be the full path to the file.
def read_file(file):
try:
with pysftp.Connection(hostname, username=username, private_key=key_path, cnopts=cnopts) as sftp:
with sftp.open(file) as f:
return pd.read_csv(f)
except:
False
def write_file(df, file):
try:
with pysftp.Connection(hostname, username=username, private_key=key_path, cnopts=cnopts) as sftp:
with sftp.open(file, "w") as f:
f.write(df.to_csv(index=False))
return True
except:
return False
# List the directory path
def list_files(path, extension='csv'):
files = []
try:
with pysftp.Connection(hostname, username=username, private_key=key_path, cnopts=cnopts) as sftp:
for filename in sftp.listdir(path):
if fnmatch.fnmatch(filename, f"*.{extension}"):
files.append(filename)
return files
except:
return False
# Delete the given file
def delete_file(file):
try:
with pysftp.Connection(hostname, username=username, private_key=key_path, cnopts=cnopts) as sftp:
sftp.remove(file)
return True
except:
return False
# Does file exist: Returns None if connection error, True or False otherwise
def file_exists(file):
try:
with pysftp.Connection(hostname, username=username, private_key=key_path, cnopts=cnopts) as sftp:
return sftp.exists(file)
except:
return None