一、建立FTP连接
Python的ftplib库可以用于向FTP服务器上传文件。首先需要建立到FTP服务器的连接,可以通过FTP类来实现。FTP类接受一个参数——FTP服务器的主机名,然后使用FTP对象中的login方法连接到FTP服务器上。
import ftplib # 建立FTP服务器连接 ftp = ftplib.FTP("ftp.example.com") # 登录到FTP服务器 ftp.login("username", "password")
在上面的代码中,参数“username”和“password”应该使用FTP服务器登录的用户名和密码代替,如无异常,连接成功后“220”响应码将被触发。如果无法建立连接,该库将生成“ftplib.error_perm”异常。
二、上传文件到FTP服务器
在连接到FTP服务器以后,我们可以调用FTP对象中的ftp.storbinary()函数将本地文件传输到FTP服务器上。
import ftplib ftp = ftplib.FTP("ftp.example.com") ftp.login("username", "password") # 以二进制格式打开本地文件 with open("example.txt", "rb") as file: # 将文件上传到FTP服务器 ftp.storbinary('STOR /example.txt', file)
上述代码将打开名称为“example.txt”的本地文件,将其读取为二进制形式,然后将其保存到FTP服务器的根目录下。
三、关闭连接
上传完成后我们需要终止连接。可以使用FTP对象中的ftp.quit()函数,它将向FTP服务器发送QUIT命令并关闭连接。
import ftplib ftp = ftplib.FTP("ftp.example.com") ftp.login("username", "password") with open("example.txt", "rb") as file: ftp.storbinary('STOR /example.txt', file) # 关闭FTP服务器的连接 ftp.quit()
四、带有进度的上传文件到FTP服务器
您可以使用tqdm库在Python中添加上传文件的进度条。Tqdm提供了可配置的实时进度条,可以轻松地与Python中的任何迭代器一起使用。您可以通过安装tqdm库(pip install tqdm)来使用它。
import ftplib from tqdm import tqdm import os ftp = ftplib.FTP("ftp.example.com") ftp.login("username", "password") filename = "example.txt" filesize = os.path.getsize(filename) with open(filename, "rb") as file: with tqdm(total=filesize, unit="B", unit_scale=True, desc=filename) as tqdm_instance: def upload_callback(chunk): ftp.storbinary("STOR /example.txt", chunk, callback=lambda sent: tqdm_instance.update(len(sent))) upload_callback(file.read()) # 关闭FTP服务器的连接 ftp.quit()
上述代码使用tqdm库和Python中的os函数获取本地文件大小。我们设置upload_callback函数去传输每个文件块并更新进度条,然后将其传递给ftp.storbinary()函数执行上传。
五、传输大文件到FTP服务器
如果要上传大文件,则可以使用FTP的分段上传功能进行上传。分段传输还称为“断点续传”,是一种上传超大文件的有效策略,可以将要上传的文件切成多个块。此方法在上传失误或服务器中断时,可重复地上传单个文件块,而无需重新传输整个文件。
import ftplib import os filename = "example.txt" ftp = ftplib.FTP("ftp.example.com") ftp.login("username", "password") with open(filename, "rb") as file: upload_size = 0 while True: chunk = file.read(8196) if not chunk: break upload_size += len(chunk) ftp.storbinary(f"APPE {filename}", chunk, 8196) print(f"已上传{upload_size}/{os.path.getsize(filename)}字节") # 关闭FTP服务器的连接 ftp.quit()
上述代码使用“APPE”命令将所有文件块添加到文件中。如果文件还不存在,FTP服务器将为您创建新文件,否则FTP服务器将添加到文件的末尾。
六、处理FTP服务器上已存在的文件
如果FTP服务器上已经存在相同名称的文件,可以在FTP服务器对文件重命名或覆盖。
覆盖原有文件
import ftplib ftp = ftplib.FTP("ftp.example.com") ftp.login("username", "password") with open("example.txt", "rb") as file: ftp.storbinary('STOR /example.txt', file, 1024) # 关闭FTP服务器的连接 ftp.quit()
以上代码确保在FTP服务器的根目录下存在一个名为“example.txt”的文件。如果文件存在,则会替换它。如果文件不存在,则创建新文件并写入内容。
重命名FTP服务器上的文件
import ftplib ftp = ftplib.FTP("ftp.example.com") ftp.login("username", "password") ftp.rename("example.txt", "example_backup.txt") # 关闭FTP服务器的连接 ftp.quit()
以上代码将FTP服务器上的“example.txt”重命名为“example_backup.txt”。
七、异常错误处理
在进行FTP上传之前,请检查网络连接和FTP服务器设置。以下是ftp.storbinary()函数可能引发的异常:ftplib.error_perm、ftplib.error_temp、ftplib.error_proto 和 ftplib.error_reply。
import ftplib ftp = ftplib.FTP("ftp.example.com") try: ftp.login("username", "password") with open("example.txt", "rb") as file: ftp.storbinary('STOR /example.txt', file) except ftplib.all_errors as e: print(str(e)) finally: ftp.quit()
以这种方式可以轻松处理异常,确保在处理上传文件时出现错误时,关闭FTP服务器的连接。
八、总结
在Python中通过ftplib库实现FTP上传文件的过程和方法非常简单。本文介绍了基本的FTP上传文件过程,包括建立FTP连接、上传文件、关闭连接、带有进度的上传文件到FTP服务器、传输大文件到FTP服务器、处理FTP服务器上的文件和异常错误处理等。Python FTP上传的功能广泛应用于实际开发中,本文介绍的方法适用于上传数据和文件。如果您需要从FTP服务器上下载文件,请使用类似的代码来打开FTP连接,然后使用ftp.retrbinary()函数从FTP服务器检索文件。