我正在尝试根据视频文件本身的 exif 数据重命名视频文件。我知道如何获取 exif 数据,也知道如何重命名文件,但我无法将两者放在一起。出于某种原因,当它到达文件夹中的最后一个文件时,它总是挂起。我已经尝试了很多东西,但都没有奏效。因此,任何帮助或建议将不胜感激。
这是我的代码(在 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))
答案 0 :(得分:0)
看起来是关于文件锁定和/或访问权限的问题。我注意到了同样的问题(也被困在 os.rename 上)。
作为一种变通方法,我使用了 GPS_NO_OPLOCK
标志,但我不知道这是否有任何副作用 - 请谨慎测试和使用。
这对我有用(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 https://stackoverflow.com/questions/61713787/reading-and-writing-windows-tags-with-python-3
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))
参考文献:
stackoverflow:Reading and writing Windows “tags” with Python 3
PyWin32 文档:propsys.SHGetPropertyStoreFromParsingName
MS 文档:GETPROPERTYSTOREFLAGS enumeration (propsys.h)
pinvoke.net:GETPROPERTYSTOREFLAGS (Enums)