2

I am using paramiko to upload files to SFTP server. I want to transfer all files in folder. The names of files are in a manner one.txt, two.txt.... . I want the files to be sent sequentially like one.txt then two.txt then three.txt.....the below code for transfer of one file runs fine, but the last code which I have tried to transfer all files is not working....

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()

Transfer all files (not working):

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')

I have files in b/: enter image description here

But the script's output is:

no txt file found
no txt file found
no txt file found
Martin Prikryl
  • 188,800
  • 56
  • 490
  • 992
goody
  • 57
  • 1
  • 2
  • 7

1 Answers1

1

Your code never reads the local directory. Your for loop iterates characters in the '/home/netcs/b/' string, not files in the /home/netcs/b/ folder.

  • For listing files in a folder, use os.listdir:
    How do I list all files of a directory?

    Also the os.listdir returns filenames only, so you have to combine them with the source when calling SFTPClient.put.

  • Similarly the remotepath argument of SFTPClient.put must also be a full file path.

  • You do not want to break after the first found file

  • Other issue is that the print('No txt file found') is misplaced. You will print that for every file that does not have .txt extension.

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()

For a recursive upload, see:
Python pysftp put_r does not work on Windows

Martin Prikryl
  • 188,800
  • 56
  • 490
  • 992