Python 当我需要EXIF DATETAKE作为日期和时间或Int时,将其提取为Str
试图重命名家庭照片,我希望将此文件夹中的所有照片重命名为 mmdd_uu00x 所以3月23日的第20张图片的文件名应该是 0323_uuu020 我的很多代码都来自其他线程,我使用了 大多数情况下,我需要的是日期(exif数据),而不是创建日期。问题是,Pillow中的EXIF模块将Date Take标记作为字符串,但我需要它是int或datetime,以便我能够修改。或者我可以解析字符串以适合我的命名格式吗Python 当我需要EXIF DATETAKE作为日期和时间或Int时,将其提取为Str,python,string,python-imaging-library,exif,pillow,Python,String,Python Imaging Library,Exif,Pillow,试图重命名家庭照片,我希望将此文件夹中的所有照片重命名为 mmdd_uu00x 所以3月23日的第20张图片的文件名应该是 0323_uuu020 我的很多代码都来自其他线程,我使用了 大多数情况下,我需要的是日期(exif数据),而不是创建日期。问题是,Pillow中的EXIF模块将Date Take标记作为字符串,但我需要它是int或datetime,以便我能够修改。或者我可以解析字符串以适合我的命名格式吗 import os import datetime from PIL import
import os
import datetime
from PIL import Image
target = input('Enter full directory path: ')
os.chdir(target)
allfiles = os.listdir(target)
counter = 0
def get_date_taken(path):
return Image.open(path)._getexif()[36867]
for filename in allfiles:
t = get_date_taken(filename)
v = datetime.datetime.fromtimestamp(t)
x = v.strftime('%m%d')
y = '{:02d}'.format(counter)
try:
os.rename(filename, x+"__"+y+".jpg")
except FileExistsError:
while True:
try:
counter += 1
y = '{:02d}'.format(counter)
os.rename(filename, x+"__"+y+".jpg")
except FileExistsError:
continue
counter = 0
break
第一个真正的计划,任何帮助将不胜感激
或者我可以解析字符串以适合我的命名格式吗
import os
import datetime
from PIL import Image
target = input('Enter full directory path: ')
os.chdir(target)
allfiles = os.listdir(target)
counter = 0
def get_date_taken(path):
return Image.open(path)._getexif()[36867]
for filename in allfiles:
t = get_date_taken(filename)
v = datetime.datetime.fromtimestamp(t)
x = v.strftime('%m%d')
y = '{:02d}'.format(counter)
try:
os.rename(filename, x+"__"+y+".jpg")
except FileExistsError:
while True:
try:
counter += 1
y = '{:02d}'.format(counter)
os.rename(filename, x+"__"+y+".jpg")
except FileExistsError:
continue
counter = 0
break
对。然后使用
strftime
,就像您对所需格式所做的那样(ps您可以将下划线移动到strftime调用中)好,因此如果您使用的是Windows,那么您的try块中将出现OSError
,您的代码将与以下增强功能一起工作(也就是关于.format
的idk)。请参见下面的os.listdir
建议
for filename in allfiles:
t = get_date_taken(filename)
v = datetime.strptime(t, 'enter format of t here')
x = v.strftime('%m%d__%H%M%S')+str(counter).zfill(3)+'.jpg'
try:
os.rename(filename, x)
except OSError:
# etc...
此外,此代码在MacOS和Linux上也不起作用!你会删除很多文件
os.rename()
下面是修复建议,但首先是os.listdir
列出了所有内容,包括子目录。如果你想所有的文件都做
allfiles = [f for f in os.listdir(target) if os.path.isfile(os.path.join(target, f)]
#...or if you want only jpgs...
allfiles = [f for f in os.listdir(target) if os.path.isfile(os.path.join(target, f) and (f.lower().endswith('.jpg') or f.lower().endswith('.jpeg))]
好的,建议:我建议重命名所有附加了全部datetime的文件(如果每秒拍摄多张图像,可以添加微秒)。e、 g
因此,如果一切正常,allfiles
是所有重命名文件的列表。排序,应该给你的图片按天升序或降序,检查其中,并确保从最早的列表到最新的
然后使用一个计数器迭代,该计数器在给定的一天为每张照片递增,到达新的一天时重置为0,并用计数器替换文件名的时间部分。时间段的长度是固定的,你的分机也是固定的,这样你就可以切掉结尾了
就这样。它需要更长的时间,因为它会通过你的文件两次,并进行排序,但我想安全起见。这样做的好处是它可以按时间组织您的文件
上述代码块的一个改进是,如果在重命名过程中引发异常,将重命名文件转换回其原始文件名,以便允许您在不编写新代码的情况下再次运行代码。这需要保留一个新文件名列表,如下所示:
new_names = []
for filename in allfiles:
v = datetime.strptime(t, 'enter format of t here')
x = v.strftime('%m%d__%H%M%S')+'.jpg'
try:
os.rename(filename, x)
except:
print 'something went wrong, reverting changes...'
for new, old in zip(new_names, allfiles[:len(new_names)]):
os.rename(new, old)
raise
else:
filename = x
new_names.append(x)
首先将datetime字符串解析为时间结构,然后可以根据需要设置格式:
from PIL import Image
DateTimeOriginal = 36867
for filename in os.listdir('.'):
if isfile(filename) and filename.endswith('.jpg'):
try:
dto_str = Image.open(filename)._getexif()[DateTimeOriginal]
dto = time.strptime(dto_str, '%Y:%m:%d %H:%M:%S')
except (KeyError, TypeError):
print('error: no exif datetime value found for %r.' % filename)
continue
new_filename = time.strftime('…', dto)
# os.rename(filename, new_filename)
PIL给你的日期字符串是什么样子的?当你按原样运行这个程序时会发生什么?