根据 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)
我正在尝试根据视频文件本身的 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)