如何使用pysftp检查SFTP中是否存在文件?

问题描述 投票:0回答:2

我正在使用 etl(第一次),我需要从客户端的 SFTP 中提取一些文件。我遇到的问题是文件编号是可变的,所以我需要检查文件是否存在并获取它,文件格式类似于“file_YYYY-MM-DD-number-n”,其中

YYYY-MM-DD
是当前日期,
n
是文件编号,所以如果有 7 个文件我必须查找:

  • file_2019-08-25-number-1
  • file_2019-08-25-number-2

直到现在我发现我可以做这样的事情

cnopts = pysftp.CnOpts()
with pysftp.Connection(host=host, port=port, username=username, password=password, cnopts=cnopts) as sftp:
    files = sftp.listdir(directory)

我如何在其中找到文件?

python sftp pysftp
2个回答
9
投票

要使用 pysftp 检查文件是否存在,请使用

Connection.exists
方法:

with pysftp.Connection(...) as sftp:
    if sftp.exists("file_2019-08-25-number-1"):
        print("1 exists")
    if sftp.exists("file_2019-08-25-number-2"):
        print("2 exists")

不过你最好一开始就不要使用 pysftp,因为它是一个死项目。使用 Paramiko 代替(参见 pysftp 与 Paramiko)。

要使用 Paramiko 检查文件是否存在,请使用

SFTPClient.stat
。请参阅如何检查使用 Paramiko exec_command 创建的文件是否存在


强制警告:不要设置

cnopts.hostkeys = None
,除非你不关心安全。有关正确的解决方案,请参阅使用 pysftp 验证主机密钥


1
投票

您可以使用 Python 的内置

re
正则表达式模块来确定文件名是否与您正在查找的一般模式匹配,如下面的示例所示。

import re


files = [
    'file_2019-08-25-number-1',
    'foo.bar',
    'file_2019-08-25-number-2',
    'file_2018-02-28-number-42',
    'some_other_file.txt'
]

pattern = re.compile(r'file_\d{4}-\d{2}-\d{2}-number-\d+')

for filename in files:
    if pattern.match(filename):
        print(f'{filename!r} matches pattern')

输出:

'file_2019-08-25-number-11' matches pattern
'file_2019-08-25-number-2' matches pattern
'file_2018-02-28-number-42' matches pattern

如果您只想检查特定文件名,您可以执行以下操作:

if filename.startswith('file_2019-08-25-number-'):
    # Do something with filename.
    ...
© www.soinside.com 2019 - 2024. All rights reserved.