我正在使用 etl(第一次),我需要从客户端的 SFTP 中提取一些文件。我遇到的问题是文件编号是可变的,所以我需要检查文件是否存在并获取它,文件格式类似于“file_YYYY-MM-DD-number-n”,其中
YYYY-MM-DD
是当前日期,n
是文件编号,所以如果有 7 个文件我必须查找:
直到现在我发现我可以做这样的事情
cnopts = pysftp.CnOpts()
with pysftp.Connection(host=host, port=port, username=username, password=password, cnopts=cnopts) as sftp:
files = sftp.listdir(directory)
我如何在其中找到文件?
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)。
SFTPClient.stat
。请参阅如何检查使用 Paramiko exec_command 创建的文件是否存在。
强制警告:不要设置
cnopts.hostkeys = None
,除非你不关心安全。有关正确的解决方案,请参阅使用 pysftp 验证主机密钥。
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.
...