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

Upload all files from local folder with specific extension to SFTP server using Paramiko

我正在使用 paramiko 将文件上传到 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 returns 文件名,所以你必须在调用 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()

有关递归上传,请参阅: