根据 EXIF 数据重命名视频文件

renaming video files based on EXIF data

我正在尝试根据视频文件本身的 exif 数据重命名视频文件。我知道如何获取 exif 数据,也知道如何重命名文件,但我无法将两者放在一起。由于某种原因,它总是在到达文件夹中的最后一个文件时挂起。我已经尝试了很多东西,但 none 成功了。因此,我们将不胜感激任何帮助或建议。

这是我的代码(运行 在本地 windows 10 上的 jupyter notebook 中):

folder = "E:\Video\2019"

import os.path, time
from datetime import datetime
import pytz
from win32com.propsys import propsys, pscon

ref_date = datetime.date(2019, 4, 15)

for path, dirs, filenames in os.walk(folder):
    for filename in filenames:
        if('mp4' in filename.lower()):
            fullpath = os.path.join(path, filename)  
            properties = propsys.SHGetPropertyStoreFromParsingName(fullpath)
            dt = properties.GetValue(pscon.PKEY_Media_DateEncoded).GetValue()
            dt_creation = dt.date()
            days = (dt_creation - ref_date).days
            os.rename(os.path.join(path, filename), os.path.join(path, str(days) + " - " + filename))

看起来像是关于文件锁定 and/or 访问权限的问题。我注意到同样的问题(也卡在 os.rename 上)。 作为变通方法,我使用了 GPS_NO_OPLOCK-flag,但我不知道它是否有任何副作用 - 请谨慎测试和使用。

这对我有用(Win10v2004,python-3.6.5,pywin32-300),见内联评论:

import os.path, time
#from datetime import datetime  # error in line: ref_date = ...
import datetime  # this works for me
import pytz
from win32com.propsys import propsys, pscon

GPS_NO_OPLOCK = 0x00000080  # not defined in propsys
# see https://docs.microsoft.com/en-us/windows/win32/api/propsys/ne-propsys-getpropertystoreflags
# see https://www.pinvoke.net/default.aspx/Enums.GETPROPERTYSTOREFLAGS
# see http://timgolden.me.uk/pywin32-docs/propsys__SHGetPropertyStoreFromParsingName_meth.html

folder = "E:\Video\2019"

ref_date = datetime.date(2019, 4, 15)

for path, dirs, filenames in os.walk(folder):
    for filename in filenames:
        if ('.mp4' in filename.lower()):  # include '.' toavoid 'mp4' in filename
            fullpath = os.path.join(path, filename)
            print(f'filename {filename}  fullpath {fullpath}')

            # see 
            properties = propsys.SHGetPropertyStoreFromParsingName(fullpath, None, GPS_NO_OPLOCK, propsys.IID_IPropertyStore)

            dt = properties.GetValue(pscon.PKEY_Media_DateEncoded).GetValue()
            dt_creation = dt.date()
            days = (dt_creation - ref_date).days

            #os.rename(os.path.join(path, filename), os.path.join(path, str(days) + " - " + filename))
            new_name = "".join([str(days), ' - ', filename])  # be a bit more pythonic
            os.rename(os.path.join(path, filename), os.path.join(path, new_name))

参考文献:

计算器溢出:

PyWin32 文档:propsys.SHGetPropertyStoreFromParsingName

微软文档:GETPROPERTYSTOREFLAGS enumeration (propsys.h)

pinvoke.net: GETPROPERTYSTOREFLAGS (Enums)