使用Python ftplib循环调用storbinary仅首文件正常其余为空的问题
解决FTP循环写入文件仅第一个有内容的问题
问题根源:你打开文件后,第一次调用storbinary会将文件指针移动到文件末尾,后续循环复用同一个文件对象时,指针已经停在结尾,没有数据可以读取传输,因此生成空文件。
提供两种可行解决方案:
方案一:每次循环重新打开文件
每次循环时重新打开目标文件,确保文件指针始终处于起始位置:
from ftplib import FTP from cred import * ftp_conn = FTP() ftp_conn.connect(host=hostname, port=21) ftp_conn.login(user=username, passwd=password) counter = 0 try: for i in range(10): filename = f'testfile{i+1}' # 使用with语句自动管理文件生命周期 with open('./testfile', mode='rb') as file: ftp_conn.storbinary(cmd=f'STOR /stresstest/{filename}', fp=file) print(f'wrote file: {filename}') counter += 1 except FileNotFoundError: print('File does not exist!') ftp_conn.quit() print(f'Written {counter} files to {ftp_conn.host}')
方案二:传输前重置文件指针
仅打开一次文件,每次传输前通过seek(0)将指针移回文件开头,减少文件IO操作:
from ftplib import FTP from cred import * ftp_conn = FTP() ftp_conn.connect(host=hostname, port=21) ftp_conn.login(user=username, passwd=password) counter = 0 try: with open('./testfile', mode='rb') as file: for i in range(10): filename = f'testfile{i+1}' # 将文件指针重置到起始位置 file.seek(0) ftp_conn.storbinary(cmd=f'STOR /stresstest/{filename}', fp=file) print(f'wrote file: {filename}') counter += 1 except FileNotFoundError: print('File does not exist!') ftp_conn.quit() print(f'Written {counter} files to {ftp_conn.host}')
两种方案对比:方案一适合小文件操作,逻辑简单;方案二减少了文件打开/关闭的开销,更适合大文件的批量传输场景。
内容的提问来源于stack exchange,提问作者Husky-CGN
相关产品推荐
相关产品推荐

