FTP client

In dit artikel zie je hoe je FTP (File Transfer Protocol) in een Python script kunt gebruiken. We gebruiken de ftplib, een bibliotheek die het FTP protocol in Python ter beschikking stelt. Met FTP kunnen we bestanden op afstand creëren en up- en downloaden door het aanroepen van de verschillende functies.

Directory listing
Met de volgende routine kunnen we de root-directory van een FTP-server uitlezen. Je kunt deze in een script gebruiken:

De groene tekst kan weggelaten worden. Het zet een ‘-‘ teken voor iedere regel van de directorie-listing.

Specifieke directorie
Als je een specifieke directorie op de FTP-server wilt uitlezen, moet je na het verbinden de directorie veranderen met de ftp.cwd(‘/’) functie. Hierbij is de parameter de directorie die je wilt uitlezen.

#specifieke_directory.py
import ftplib
ftp = ftplib.FTP("[FTP-server]")
ftp.login("[gebruikersnaam]", "[wachtwoord]")
data = []
ftp.cwd('/httpdocs/') # verander de directory naar /httpdocs/
ftp.dir(data.append)
ftp.quit()
for line in data:
print "-", line

Download bestand
Om te downloaden gebruiken we de retrbinary() functie:

#download_file.py
import ftplib
import sys
def getFile(ftp, filename):
try:
ftp.retrbinary("RETR " + filename ,open(filename, 'wb').write)
except:
print "Error"
ftp = ftplib.FTP("[FTP-server]")
ftp.login("[gebruikersnaam]", "[wachtwoord]")
ftp.cwd('/httpdocs/') # change directory to /httpdocs/
getFile(ftp,'Bier.jpg')
ftp.quit()

Of dit alternatief:

from ftplib import FTP
from datetime import datetime

start = datetime.now()
ftp = FTP('[FTP-server]')
ftp.login('[gebruikersnaam]','[wachtwoord]')

# Get All Files
files = ftp.nlst()

# Print out the files
for file in files:
	print("Downloading..." + file)
	ftp.retrbinary("RETR " + file ,open("download/to/your/directory/" + file, 'wb').write)

ftp.close()

end = datetime.now()
diff = end - start
print('All files downloaded for ' + str(diff.seconds) + 's')`

Uploaden bestanden
We kunnen bestanden naar de server uploaden met het storlines() commando. In dit voorbeeld worden de bestanden ‘Bier.jpg’ en ‘chip.jpg’ ge-upload naar de directorie /httpdocs/. Als het bestand in de root-directorie terecht moet komen, kun je een # voor de ftp.cwd() functie zetten.


import ftplib
import os
def upload(ftp, file):
ext = os.path.splitext(file)[1]
if ext in (".txt", ".htm", ".html"):
ftp.storlines("STOR " + file, open(file))
else:
ftp.storbinary("STOR " + file, open(file, "rb"), 1024)
ftp = ftplib.FTP("[FTP-server]")
ftp.login("[gebruikersnaam]", "[wachtwoord]")
ftp.cwd('/httpdocs/') # verander de doeldirectory naar /httpdocs/
upload(ftp, "Bier.jpg")

Of dit alternatief:

import ftplib
session = ftplib.FTP('[FTP-server]','[gebruikersnaam]','[wachtwoord]')
file = open('Bier.jpg','rb') # file to send
session.storbinary('STOR Bier.jpg', file) # send the file
file.close() # close file and FTP
session.quit()

Rename bestand in specifieke directorie
Om een bestand op de server van naam te veranderen wordt de functie ftp.rename(‘oude.naam’, ‘nieuwe.naam’) gebruikt. Mocht het nieuwe bestand al bestaan, dan wordt deze overschreven. Vervolgens wordt de directorie weergegeven met ftp.retrlines(‘LIST’) .

import ftplib
ftp = ftplib.FTP("[FTP-server]")
ftp.login("[gebruikersnaam]", "[wachtwoord]")
ftp.cwd('/httpdocs/') # verander directorie naar /httpdocs/
ftp.rename('logboek.log','logboek.old') # rename bestand
print("\n\033[1;33mlogboek is hernoemd naar logboek.old en heeft bestand met zelfde naam overschreven\033[1;m\n") # tekst met kleurcode
ftp.retrlines('LIST') # list directory contents
ftp.quit()