使用Paramiko按顺序批量上传本地目录TXT文件至SFTP服务器失败求助
批量SFTP上传问题排查与解决方案
我来帮你搞定这个批量上传的问题,你的代码里有几个关键错误导致了重复输出"No txt file found",而且根本没在处理目录里的文件:
问题分析
- 遍历的是路径字符串而非文件列表
你写的for file in source是在遍历'/home/netcs/b/'这个字符串的每一个字符,不是目录里的文件。每个字符自然都不满足.txt结尾的条件,所以每次循环都会触发else分支输出提示。 - SFTP连接重复创建
每次循环都新建一个SSH传输连接,不仅效率极低,还容易引发连接数超限的问题。应该只创建一次连接,在所有文件上传完成后再关闭。 sftp.put参数错误
你传给put的是整个源目录和目标目录的路径,而不是单个文件的完整路径,这样SFTP不知道要上传哪个具体文件。- 多余的
break语句
这个break会让循环只执行一次就直接退出,根本没机会处理多个文件。 else分支位置错误
现在的else是和if配对,每个字符判断不满足就输出提示。应该把它和for循环配对,只有当循环结束后完全没找到任何txt文件时才提示。
修正后的代码
import paramiko import os # 配置参数 source_dir = r'/home/netcs/b/' dest_dir = r'/home/tein/c/' hostname = '10.10.10.9' port = 22 username = 'tein' password = 'po' # 获取目录下所有txt文件,并按one.txt、two.txt...的顺序排序 def sort_files(file_list): # 提取文件名里的英文数字部分(one、two...转成数字) def get_file_order(filename): name_part = filename.split('.')[0] # 这里假设文件名是one、two、three...对应1、2、3,可根据实际情况补充 num_map = {'one':1, 'two':2, 'three':3, 'four':4, 'five':5} return num_map.get(name_part.lower(), 999) return sorted(file_list, key=get_file_order) try: # 只创建一次SFTP连接 t = paramiko.Transport((hostname, port)) t.connect(username=username, password=password) sftp = paramiko.SFTPClient.from_transport(t) # 获取目录下的txt文件 txt_files = [f for f in os.listdir(source_dir) if f.endswith('.txt')] if not txt_files: print('No txt file found') else: # 按指定顺序排序 sorted_files = sort_files(txt_files) for filename in sorted_files: source_path = os.path.join(source_dir, filename) # 目标文件名和源文件名保持一致,也可根据需求自定义 dest_path = os.path.join(dest_dir, filename) print(f'正在上传 {filename}...') sftp.put(source_path, dest_path) print(f'{filename} 上传完成') finally: # 所有文件上传完成后关闭连接 if 't' in locals() and t.is_active(): t.close()
关键改进说明
- 正确获取文件列表:用
os.listdir读取目标目录下的文件,过滤出.txt后缀的文件。 - 自定义排序逻辑:通过
sort_files函数确保文件按one.txt→two.txt→three.txt的顺序传输,如果你有更多英文数字命名的文件,只需要在num_map里补充对应关系即可。 - 复用SFTP连接:把连接创建放在循环外面,避免重复建立连接,提升效率。
- 正确拼接文件路径:用
os.path.join拼接完整的源文件和目标文件路径,避免手动拼接路径时出现的错误。 - 合理的提示逻辑:只有当目录下完全没有txt文件时才输出提示,不会每次循环都乱输出。
内容的提问来源于stack exchange,提问作者goody
相关产品推荐
相关产品推荐

