如何在Python中获取无路径文件(typing.IO/SpooledTemporaryFile)的最后修改日期
获取未知路径文件对象的最后修改日期
针对你持有的typing.IO或tempfile.SpooledTemporaryFile类型文件对象,需分情况处理来获取最后修改日期,以下是具体实现方案:
核心逻辑说明
只有关联实际磁盘文件的对象才能获取修改时间,纯内存中的IO对象(如BytesIO)无对应磁盘文件,无法获取该信息。
1. 处理SpooledTemporaryFile对象
SpooledTemporaryFile默认在内存中存储数据,需先强制将内容写入磁盘,再获取底层文件的路径:
- 调用
rollover()方法,确保文件内容写入磁盘 - 通过内部属性
_file获取底层磁盘文件对象,进而拿到文件路径
2. 处理通用IO对象
普通IO对象(如open()返回的文件对象)通常带有name属性,直接通过该属性获取文件路径即可;若没有name属性,说明是纯内存对象,无法获取修改时间。
完整代码实现
import os from tempfile import SpooledTemporaryFile from typing import IO, Union from datetime import datetime def partition_csv(file: Union[IO, SpooledTemporaryFile]): # 处理SpooledTemporaryFile类型 if isinstance(file, SpooledTemporaryFile): file.rollover() # 强制将内容写入磁盘 disk_file = file._file file_path = disk_file.name else: # 尝试获取普通IO对象的文件路径 try: file_path = file.name except AttributeError: raise ValueError("该文件对象未关联实际磁盘文件,无法获取最后修改日期") # 获取最后修改时间戳并转换为可读格式 mtime_timestamp = os.stat(file_path).st_mtime last_modified = datetime.fromtimestamp(mtime_timestamp) return last_modified
注意事项
SpooledTemporaryFile的_file是内部属性,虽在多数Python版本中稳定可用,但需注意不同版本的实现差异- 纯内存IO对象(如
BytesIO、StringIO)无对应磁盘文件,会触发ValueError,需根据业务逻辑处理该异常 - 返回的
last_modified是datetime对象,可根据需求格式化为字符串(如last_modified.strftime("%Y-%m-%d %H:%M:%S"))
内容的提问来源于stack exchange,提问作者M Kravets
相关产品推荐
相关产品推荐

