使用 Paramiko 的 SFTPClient 在远程路径中使用通配符
Using wildcard in remote path using Paramiko's SFTPClient
我想将文件从远程服务器复制到本地。
import paramiko
paramiko.util.log_to_file('/tmp/paramiko.log')
# open transport
username = "user"
host="example.com"
port = 22
transport = paramiko.Transport((host, port))
transport.start_client()
private_key_file = "/home/user/.ssh/id_rsa"
agent = paramiko.Agent()
key = paramiko.RSAKey.from_private_key_file(private_key_file)
transport.auth_publickey(username, key)
# get sftp client
sftp = paramiko.SFTPClient.from_transport(transport)
source = "/home/user/user_1.csv"
target = "/home/local/local_sftp.txt"
sftp.get(x[0], x[1])
以上代码运行良好,但我想使用 source = "/home/user/user_*.csv"
,但未评估此通配符。
谁能帮我解决这个问题。
我找到 但无法解决 SFTPClient
的问题。
Paramiko SFTPClient
不支持通配符。
所以你必须自己列出远程文件夹中的文件,然后筛选出你要下载的文件:
import re
remote_path = "/home/user"
local_path = "/home/local"
files = sftp.listdir(remote_path)
for filename in files:
if re.match("^user_.*\.csv$", filename):
print(filename)
sftp.get(remote_path + "/" + filename, local_path + "/" + filename)
或者使用fnmatch
模块。参见 。
检索文件列表后,fnmatch 通常比此作业的正则表达式更好:
import fnmatch
for name in sftp.listdir(remote_path):
if fnmatch.fnmatch(name, "user_*.csv"):
print(name)
如果您将 SFTPServer 部署在类似 *nix 的系统上,这只是一个简单的解决方案,请使用 execute
方法,如下所示:
conn.execute("ls dir/*.csv")
我想将文件从远程服务器复制到本地。
import paramiko
paramiko.util.log_to_file('/tmp/paramiko.log')
# open transport
username = "user"
host="example.com"
port = 22
transport = paramiko.Transport((host, port))
transport.start_client()
private_key_file = "/home/user/.ssh/id_rsa"
agent = paramiko.Agent()
key = paramiko.RSAKey.from_private_key_file(private_key_file)
transport.auth_publickey(username, key)
# get sftp client
sftp = paramiko.SFTPClient.from_transport(transport)
source = "/home/user/user_1.csv"
target = "/home/local/local_sftp.txt"
sftp.get(x[0], x[1])
以上代码运行良好,但我想使用 source = "/home/user/user_*.csv"
,但未评估此通配符。
谁能帮我解决这个问题。
我找到 SFTPClient
的问题。
Paramiko SFTPClient
不支持通配符。
所以你必须自己列出远程文件夹中的文件,然后筛选出你要下载的文件:
import re
remote_path = "/home/user"
local_path = "/home/local"
files = sftp.listdir(remote_path)
for filename in files:
if re.match("^user_.*\.csv$", filename):
print(filename)
sftp.get(remote_path + "/" + filename, local_path + "/" + filename)
或者使用fnmatch
模块。参见
检索文件列表后,fnmatch 通常比此作业的正则表达式更好:
import fnmatch
for name in sftp.listdir(remote_path):
if fnmatch.fnmatch(name, "user_*.csv"):
print(name)
如果您将 SFTPServer 部署在类似 *nix 的系统上,这只是一个简单的解决方案,请使用 execute
方法,如下所示:
conn.execute("ls dir/*.csv")