如何解决如何仅从 SFTP 下载过去 14 天名称中带有时间戳的文件?
import os
import datetime
from datetime import datetime
from dateutil.relativedelta import relativedelta
from dateutil import parser
import pysftp
lt_all = []
# disable hostkey checking
cnopts = pysftp.CnOpts()
cnopts.hostkeys = None
lt_all = []
srv = pysftp.Connection('sftp.com',username = 'username',password = "password",cnopts = cnopts)
srv.chdir('download')
server_file_list = srv.listdir()
for lt_file in server_file_list:
if srv.isfile(lt_file) and ('invoices' in lt_file.lower() and 'daily' in lt_file.lower() and lt_file.endswith('.csv')):
try:
srv.get(lt_file,os.path.join(os.path.join(data_folder_path,'Invoices'),lt_file),preserve_mtime=True)
except:
print("No Invoices Today")
好消息: 我已成功从 SFTP 位置下载所有 CSV 文件。
坏消息:所有 CSV 文件正在下载。 每天下载 300 多个文件是次优的,因为下载已经下载的文件是多余的。
这些 CSV 文件每天生成。这些文件每天都遵循相同的命名约定:invoices_daily_20200204.csv
。请注意,日期以 yyyymmdd
格式出现在最后。编辑:格式实际上是 mmddyy
。
如何将我的下载限制为仅在过去 14 天内创建的文件? pysftp 是最好的模块吗?
解决方法
使用您最初声明的固定可排序时间戳格式 yyyymmdd
,这会很容易。如果您知道总是有 14 个文件要下载,请使用 @lllrnr101 的解决方案。如果这不确定,请生成一个具有 14 天时间戳的阈值文件名,并将其与列表中的文件名进行比较:
from datetime import datetime,timedelta
d14ago = datetime.now() - timedelta(14)
ts = datetime.strftime(d14ago,'%Y%m%d')
threshold = f"invoices_daily_{ts}.csv"
for lt_file in server_file_list:
if srv.isfile(lt_file) and (lt_file >= threshold):
# Download
但事实证明,您的时间戳格式是 mmddyy
(%m%d%y
),无法按字典顺序排序。这使解决方案复杂化。您可以做的一件事是重新排序时间戳以使其按字典顺序排序:
ts = datetime.strftime(d14ago,'%m%d%y')
for lt_file in server_file_list:
if srv.isfile(lt_file) and lt_file.startswith("invoices_daily_"):
file_ts = lt_file[19:21] + lt_file[15:17] + lt_file[17:19]
if file_ts >= ts:
# Download
两个旁注:
-
使用
Connection.isfile
测试条目是否为文件是低效的。它需要调用服务器。虽然实际上Connection.listdir
已经拥有该信息。使用
Connection.listdir_attr
和S_ISREG
测试。有关示例,请参阅 Python pysftp get_r from Linux works fine on Linux but not on Windows。 -
不要设置
cnopts.hostkeys = None
,除非你不关心安全。有关正确的解决方案,请参阅 Verify host key with pysftp。
既然您已经有了 yyyymmdd 命名格式,为什么不根据它对 server_file_list 进行排序并取 server_file_list[-14:] 切片?一个简单的 server_file_list.sort() 将起作用,因为所有名称都相同。
如果您没有遵循命名约定,您可以使用 pysftp 提供的 stat() 方法来访问创建时间并基于此对整个 server_file_list 进行排序。然后取 server_file_list[-14:] 切片。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。