Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当我需要EXIF DATETAKE作为日期和时间或Int时,将其提取为Str_Python_String_Python Imaging Library_Exif_Pillow - Fatal编程技术网

Python 当我需要EXIF DATETAKE作为日期和时间或Int时,将其提取为Str

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

试图重命名家庭照片,我希望将此文件夹中的所有照片重命名为

mmdd_uu00x

所以3月23日的第20张图片的文件名应该是

0323_uuu020

我的很多代码都来自其他线程,我使用了 大多数情况下,我需要的是日期(exif数据),而不是创建日期。问题是,Pillow中的EXIF模块将Date Take标记作为字符串,但我需要它是int或datetime,以便我能够修改。或者我可以解析字符串以适合我的命名格式吗

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给你的日期字符串是什么样子的?当你按原样运行这个程序时会发生什么?