Windows Server中os.path.getmtime返回负数报错,求文件修改时间获取方案
在Windows Server中获取文件修改时间的问题
我在Windows Server中编写Python脚本,需要获取文件夹内文件的修改时间,代码如下:
filestamp = datetime.fromtimestamp(os.path.getmtime(path+filename))
该代码在本地运行正常,但在Windows Server中执行时,datetime.fromtimestamp抛出错误:
OSError : [Errno 22] Invalid argument
打印os.path.getmtime(path+filename)的结果为-11623064500.963923,该值无法正常转换为datetime,且仅在Windows Server中出现此问题。尝试过将数值乘/除以1000,但无效(尤其数值为负时)。请问有获取文件修改时间的替代方法吗?
替代解决方案
1. 异常捕获+UTC时间转换
Windows支持的文件时间范围从1601年1月1日开始,早于Unix时间戳的起始点(1970年1月1日),导致负时间戳转换失败。可以改用UTC时间转换后再适配时区:
import os from datetime import datetime def get_file_modify_time(file_path): try: mtime = os.path.getmtime(file_path) return datetime.fromtimestamp(mtime) except OSError: # 针对早于1970年的文件时间,用UTC转换后再转本地时区 return datetime.utcfromtimestamp(mtime).astimezone()
2. 使用pathlib模块(Python 3.4+)
pathlib提供了更安全的路径拼接和文件状态读取方式,对Windows兼容性更好:
from pathlib import Path from datetime import datetime # 用Path自动处理路径拼接,避免手动拼接的错误 file_path = Path(path) / filename try: filestamp = datetime.fromtimestamp(file_path.stat().st_mtime) except OSError: filestamp = datetime.utcfromtimestamp(file_path.stat().st_mtime).astimezone()
3. 调用Windows原生API(依赖pywin32)
如果上述方法仍有问题,可借助pywin32直接读取Windows原生文件时间,彻底绕过Unix时间戳转换:
import win32file import win32con from datetime import datetime def get_win_native_mtime(file_path): # 打开文件获取句柄 handle = win32file.CreateFile( file_path, win32con.GENERIC_READ, win32con.FILE_SHARE_READ | win32con.FILE_SHARE_WRITE, None, win32con.OPEN_EXISTING, 0, None ) try: # 获取文件创建、修改、访问时间,修改时间是元组第二个元素 _, mtime, _ = win32file.GetFileTime(handle) return datetime.fromtimestamp(mtime.timestamp()) finally: handle.Close()
关键说明
出现负时间戳报错的核心原因是Windows文件时间范围覆盖了Unix时间戳之前的日期,datetime.fromtimestamp无法直接解析这类负时间戳。改用UTC转换或直接读取Windows原生时间,就能解决兼容性问题。
内容的提问来源于stack exchange,提问作者Relinwar
相关产品推荐
相关产品推荐

