使用Paramiko将本地文件夹中具有特定扩展名的所有文件上载到SFTP服务器
问题描述
我正在使用pariko将文件上传到SFTP服务器。我想传输文件夹中的所有文件。文件名的格式为one.txt
,two.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.put
的remotepath
参数也必须是完整文件路径。您不希望在找到第一个文件后
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
相关文章