使用Paramiko将本地文件夹中具有特定扩展名的所有文件上载到SFTP服务器

2022-09-01 00:00:00 python python-3.x sftp paramiko

问题描述

我正在使用pariko将文件上传到SFTP服务器。我想传输文件夹中的所有文件。文件名的格式为one.txttwo.txt...。我希望按如下顺序发送文件:one.txt然后two.txt然后three.txt.....下面用于传输一个文件的代码运行良好,但我尝试传输所有文件的最后一个代码不起作用...

import paramiko

source = r'/home/netcs/b/one.txt'
dest = r'/home/tein/c/pickle.txt'
hostname = '10.10.10.9'
port = 22 # default port for SSH
username = 'tein'
password = 'po'

try:
    t = paramiko.Transport((hostname, port))
    t.connect(username=username, password=password)
    sftp = paramiko.SFTPClient.from_transport(t)
    sftp.put(source, dest)
finally:
    t.close()

传输所有文件(不工作):

import paramiko

source = r'/home/netcs/b/'
dest = r'/home/tein/c/'
hostname = '10.10.10.9'
port = 22 # default port for SSH
username = 'tein'
password = 'po'
for file in source:
    if file.endswith('.txt'):
       try:
          t = paramiko.Transport((hostname, port))
          t.connect(username=username, password=password)
          sftp = paramiko.SFTPClient.from_transport(t)
          sftp.put(source, dest)
       finally:
          t.close()
       break
    else:
        print('No txt file found')
我在b/中有文件:

但脚本的输出为:

no txt file found
no txt file found
no txt file found

解决方案

您的代码从不读取本地目录。您的for循环迭代'/home/netcs/b/'字符串中的字符,而不是/home/netcs/b/文件夹中的文件。

  • 要列出文件夹中的文件,请使用os.listdir
    How do I list all files of a directory?

    os.listdir也只返回文件名,因此在调用SFTPClient.put时必须将它们与source结合使用。

  • 同样,SFTPClient.putremotepath参数也必须是完整文件路径。

  • 您不希望在找到第一个文件后break

  • 另一个问题是print('No txt file found')放错了位置。您将为每个没有.txt扩展名的文件打印该命令。

files = os.listdir(source)
for file in files:
    if file.endswith('.txt'):
       try:
          t = paramiko.Transport((hostname, port))
          t.connect(username=username, password=password)
          sftp = paramiko.SFTPClient.from_transport(t)
          sftp.put(os.path.join(source, file), dest + "/" + file)
       finally:
          t.close()

有关递归上传,请参阅:
Python pysftp put_r does not work on Windows

相关文章