You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Paramiko按顺序批量上传本地目录TXT文件至SFTP服务器失败求助

批量SFTP上传问题排查与解决方案

我来帮你搞定这个批量上传的问题,你的代码里有几个关键错误导致了重复输出"No txt file found",而且根本没在处理目录里的文件:

问题分析

  1. 遍历的是路径字符串而非文件列表
    你写的for file in source是在遍历'/home/netcs/b/'这个字符串的每一个字符,不是目录里的文件。每个字符自然都不满足.txt结尾的条件,所以每次循环都会触发else分支输出提示。
  2. SFTP连接重复创建
    每次循环都新建一个SSH传输连接,不仅效率极低,还容易引发连接数超限的问题。应该只创建一次连接,在所有文件上传完成后再关闭。
  3. sftp.put参数错误
    你传给put的是整个源目录和目标目录的路径,而不是单个文件的完整路径,这样SFTP不知道要上传哪个具体文件。
  4. 多余的break语句
    这个break会让循环只执行一次就直接退出,根本没机会处理多个文件。
  5. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 20:37:28