【问题标题】:Python - how to read Windows "Media Created" date (not file creation date)Python - 如何读取 Windows“媒体创建”日期(不是文件创建日期)
【发布时间】:2015-10-09 00:25:02
【问题描述】:

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

Windows 有一个名为“Media created”的属性,它具有相机记录的实际时间。文件的修改时间通常不正确,因此有数百个文件无法使用。

如何在 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)

【问题讨论】:

  • 这是一个很好的第一步,但它给了我错误的日期。日期和时间已接近,但已关闭。
  • 呃,我应该看到的。东京比世界标准时间早 8 或 9 个小时,我期待 PST,所以它让我失望了。现在我懂了。您可以将此作为答案提交,以便我将其投票为正确的答案吗?谢谢!
  • 对于.mov文件,可以试试Getting metadata for MOV video

标签: python windows media


【解决方案1】:

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

【讨论】:

  • 感谢两位的帮助。作为说明 - 我认为它是文件属性的原因是因为当您在详细视图中查看文件时,Windows 将其列为“创建日期”。
  • eryksun,您的代码的最后一行有问题。它给了我一个关于“astimezone”的属性错误
  • @Tensigh,我只在 Python 3 中测试过。显然在 Python 2 中它返回的是自定义类型,而不是 datetime.datetime 子类。尝试解决方法。
  • @erkysun,如果可以的话,我会再给你一个支持。效果很好!谢谢,您恢复了我寻求 SO 帮助的希望。
  • 你为文件路径输入了什么?我用的是win10,但我无法让代码运行。我通过了 filepath = '' 但它在这一行出错:“dt = datetime.datetime.fromtimestamp(int(dt))”
【解决方案2】:

如果您正在谈论的属性来自相机,则它不是文件系统权限:它是 Windows 正在读取并呈现给您的视频本身内的元数据。

此类元数据的一个示例是 JPEG 图像的 EXIF 数据:拍摄照片的相机类型、使用的设置等。

您需要打开 .mp4 文件并解析元数据,最好使用一些现有的库来执行此操作。您将无法从文件系统中获取信息,因为它不存在。

现在,另一方面,如果您想要的只是文件创建日期(实际上并非来自相机,而是在文件首次放入当前计算机时设置,并且可能已初始化为一些以前在相机上的值)...这可以通过os.path.getctime(orig) 获得。

【讨论】:

  • 这是一个很好的线索;我需要查找图片的元数据,而不是文件属性。谢谢。
猜你喜欢
  • 1970-01-01
  • 2012-01-11
  • 2012-04-16
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 2011-06-27
相关资源
最近更新 更多