Python - 如何读取Windows“媒体创建”日期(不是文件创建日期)

Ten*_*igh 4 python windows media

我正在转换几个旧视频文件以节省空间。由于这些文件是个人视频,我希望新文件具有旧文件的创建时间。

Windows 有一个名为“创建的媒体”的属性,其中包含相机记录的实际时间。文件的修改时间通常不正确,因此有数百个文件无法正常工作。

如何在 Python 中访问这个“媒体创建”日期?我疯狂地搜索谷歌却找不到它。以下是创建日期和修改日期匹配时有效的代码示例:

files = []
for file in glob.glob("*.AVI"):
   files.append(file)

for orig in files:
    origmtime = os.path.getmtime(orig)
    origatime = os.path.getatime(orig)
    mark = (origatime, origmtime)
    for target in glob.glob("*.mp4"):
       firstroot = target.split(".mp4")[0]
       if firstroot in orig:
          os.utime(target, mark)
Run Code Online (Sandbox Code Playgroud)

Ery*_*Sun 6

正如 Borealid 所指出的,“媒体创建”值不是文件系统元数据。Windows shell 从文件本身中获取此值作为元数据。它可以在 API 中作为Windows Property进行访问。如果您使用的是 Windows Vista 或更高版本并且安装了适用于 Windows 的 Python 扩展,则可以轻松访问 Windows shell 属性。只需调用SHGetPropertyStoreFromParsingName,您将在模块中找到它propsys。它返回一个PyIPropertyStore实例。标记为“媒体已创建”的属性是System.Media.DateEncoded。您可以使用属性键访问此属性PKEY_Media_DateEncoded,您可以在 中找到该属性propsys.pscon。在 Python 3 中,返回值是一个datetime.datetime子类,时间采用 UTC 格式。在 Python 2 中,该值是自定义时间类型,具有Format提供strftime样式格式设置的方法。如果您需要将值转换为本地时间,pytz模块具有 IANA 时区数据库。

例如:

import pytz
import datetime
from win32com.propsys import propsys, pscon

properties = propsys.SHGetPropertyStoreFromParsingName(filepath)
dt = properties.GetValue(pscon.PKEY_Media_DateEncoded).GetValue()

if not isinstance(dt, datetime.datetime):
    # In Python 2, PyWin32 returns a custom time type instead of
    # using a datetime subclass. It has a Format method for strftime
    # style formatting, but let's just convert it to datetime:
    dt = datetime.datetime.fromtimestamp(int(dt))
    dt = dt.replace(tzinfo=pytz.timezone('UTC'))

dt_tokyo = dt.astimezone(pytz.timezone('Asia/Tokyo'))
Run Code Online (Sandbox Code Playgroud)