SFTP文件停留时长检测Python脚本问题求助
解决SFTP文件停留时长统计问题
问题根源
你当前使用的st_mtime是文件的最后修改时间,文件上传到SFTP后如果没有被修改,这个时间会一直保持不变,自然无法得到递增的停留时长。下面提供两种可行的改进方案:
方案一:记录文件首次被检测到的时间
这是最可靠的通用方案,不依赖SFTP服务器的特殊属性:
- 核心逻辑:脚本第一次检测到文件存在时,记录当前时间;之后每次运行用当前时间减去首次记录的时间,得到文件的停留时长。
- 改进后的代码:
import time import datetime # 初始化首次检测时间为None first_detected_time = None while True: try: # 检查文件是否存在 file_stat = sftp_client.stat(sftp_directory + '/vaishant_test2.log') if first_detected_time is None: # 首次发现文件,记录当前时间(建议和SFTP服务器时区保持一致) first_detected_time = datetime.datetime.now() print(f"首次检测到文件:{first_detected_time.strftime('%H:%M:%S')}") else: # 计算并输出停留时长 current_time = datetime.datetime.now() duration = current_time - first_detected_time mins = int(duration.total_seconds() // 60) secs = int(duration.total_seconds() % 60) print(f"文件已停留:{mins}分钟 {secs}秒") except FileNotFoundError: # 文件不存在时重置记录 first_detected_time = None print("文件未找到") time.sleep(60)
- 补充:如果脚本可能重启,可将
first_detected_time写入本地文件(如JSON、TXT)做持久化,避免重启后丢失记录。
方案二:获取SFTP服务器的文件创建时间(依赖服务器支持)
部分SFTP服务器会提供文件的创建时间字段,但不同系统的字段名和含义有差异:
- Unix类系统:
st_ctime是文件元数据修改时间,而非创建时间;BSD系统支持st_birthtime表示创建时间。 - Windows系统:
st_ctime就是文件创建时间。 - 代码示例:
import datetime file_stat = sftp_client.stat(sftp_directory + '/vaishant_test2.log') # 尝试获取创建时间 try: creation_timestamp = file_stat.st_birthtime # BSD/Linux部分环境支持 except AttributeError: creation_timestamp = file_stat.st_ctime # fallback到st_ctime,需确认服务器实际含义 # 转换为可读时间并计算停留时长 creation_time = datetime.datetime.fromtimestamp(creation_timestamp) current_time = datetime.datetime.now() duration = current_time - creation_time print(f"文件创建时间:{creation_time.strftime('%Y-%m-%d %H:%M:%S')}") print(f"文件已停留:{int(duration.total_seconds()//3600)}小时 {int(duration.total_seconds()%3600//60)}分钟")
- 注意:该方案需要提前测试SFTP服务器返回的时间字段是否为真实的文件上传/创建时间,避免统计误差。
关键注意事项
- 时区一致性:确保脚本运行的本地时间与SFTP服务器时间时区一致,或统一使用UTC时间计算,避免时长统计出现偏差。
- 异常处理:需处理文件被删除、SFTP连接中断等异常情况,保证脚本稳定性。
内容的提问来源于stack exchange,提问作者Vaishant Sah
相关产品推荐
相关产品推荐

