小代码 - iOS导出照片到macOS后 Python 修改名称为照片拍摄时间

文章目录

    • 引言
    • macOS 文件命令
    • 代码实现


引言

在 macOS 上导出 iOS的照片:https://sspai.com/post/63265
得到的是类似 IMG_XXX 这样的文件,我希望将文件名替换为创建(拍摄日期)


使用python 的 os.stat方法 ,得到的是这样的结果:


file_path = '/Users/xx/Pictures/照片2202/IMG_2627.jpeg'
print(os.stat(file_path))

# os.stat_result(st_mode=33188, st_ino=13004319047, st_dev=16777223, st_nlink=1, st_uid=501, st_gid=20, st_size=388475, st_atime=1668682186, st_mtime=1668501156, st_ctime=1668501156)

这里的信息有限,更多信息需要查看元数据。


osxmetadata 这样的模块,按道理是可以得到更到的元数据信息,但是安装出现错误;完成更重要,想到不妨使用 macOS 的文件命令来解决问题。
osxmetadata : https://github.com/RhetTbull/osxmetadata

macOS 文件命令

  • file
  • mdls

这两个命令都可以得到我想要的初始时间,不过 mdls 更好用一些(格式更清晰),这里使用它。
mdls 更多信息可见:《macOS - mdls, mdfind, mdutil, xargs 命令使用》
https://blog.csdn.net/lovechris00/article/details/125406449


这两个命令调用结果:

$ file /Users/xx/Pictures/照片2202/IMG_2627.jpeg 
/Users/xx/Pictures/照片2202/IMG_2627.jpeg: JPEG image data, JFIF standard 1.02, resolution (DPI), density 72x72, segment length 16, Exif Standard: [TIFF image data, big-endian, direntries=7, orientation=upper-left, xresolution=98, yresolution=106, resolutionunit=2, datetime=2021:09:05 22:14:38TIFF image data, big-endian, direntries=7, orientation=upper-left, xresolution=98, yresolution=106, resolutionunit=2, datetime=2021:09:05 22:14:38], baseline, precision 8, 1080x1440, components 3

$ mdls -name kMDItemContentCreationDate   /Users/xx/Pictures/照片2202/IMG_2627.jpeg
kMDItemContentCreationDate = 2021-09-05 14:14:38 +0000

# 查看更多元数据
$ mdls  /Users/xx/Pictures/照片2202/IMG_2627.jpeg
_kMDItemDisplayNameWithExtensions      = "IMG_2627.jpeg"
kMDItemBitsPerSample                   = 24
kMDItemColorSpace                      = "RGB"
kMDItemContentCreationDate             = 2021-09-05 14:14:38 +0000
kMDItemContentCreationDate_Ranking     = 2021-09-05 00:00:00 +0000
kMDItemContentModificationDate         = 2021-09-05 14:14:38 +0000
kMDItemContentModificationDate_Ranking = 2021-09-05 00:00:00 +0000
kMDItemContentType                     = "public.jpeg"
kMDItemContentTypeTree                 = (
    "public.jpeg",
    "public.image",
    "public.data",
    "public.item",
    "public.content"
)
kMDItemDateAdded                       = 2022-11-15 08:32:36 +0000
kMDItemDateAdded_Ranking               = 2022-11-15 00:00:00 +0000
kMDItemDisplayName                     = "IMG_2627.jpeg"
kMDItemDocumentIdentifier              = 0
kMDItemEXIFVersion                     = "2.2.1"
kMDItemFSContentChangeDate             = 2022-11-15 08:32:36 +0000
kMDItemFSCreationDate                  = 2022-11-15 08:32:36 +0000
kMDItemFSCreatorCode                   = ""
kMDItemFSFinderFlags                   = 0
kMDItemFSHasCustomIcon                 = (null)
kMDItemFSInvisible                     = 0
kMDItemFSIsExtensionHidden             = 0
kMDItemFSIsStationery                  = (null)
kMDItemFSLabel                         = 0
kMDItemFSName                          = "IMG_2627.jpeg"
kMDItemFSNodeCount                     = (null)
kMDItemFSOwnerGroupID                  = 20
kMDItemFSOwnerUserID                   = 501
kMDItemFSSize                          = 388475
kMDItemFSTypeCode                      = ""
kMDItemHasAlphaChannel                 = 0
kMDItemInterestingDate_Ranking         = 2021-09-05 00:00:00 +0000
kMDItemKind                            = "JPEG图像"
kMDItemLogicalSize                     = 388475
kMDItemOrientation                     = 1
kMDItemPhysicalSize                    = 389120
kMDItemPixelCount                      = 1555200
kMDItemPixelHeight                     = 1440
kMDItemPixelWidth                      = 1080
kMDItemProfileName                     = "sRGB IEC61966-2.1"
kMDItemResolutionHeightDPI             = 72
kMDItemResolutionWidthDPI              = 72
(base) 



代码实现

import os 
import re 
import sys 
import shutil



from datetime import datetime, timezone, timedelta



def get_file_date(file_path):
     
    script = f'mdls -name kMDItemContentCreationDate {file_path}'
    ret = os.popen(script).read() 
    print(ret)
    date_str = ret.replace('kMDItemContentCreationDate = ', '').strip()[:19].strip()  
    if len(date_str) < 18:
        print('xx ', file_path)
        return None
    d1 =  datetime.strptime(date_str, '%Y-%m-%d %H:%M:%S')  
    tz = timezone(timedelta(hours=-8)) 
    d2 = d1.astimezone(tz).strftime('%Y_%m_%d_%H_%M_%S')
    # print(d2, type(d2))
    return d2

def read_dir(src_dir): 
    save_dir = os.path.join(src_dir, 'storage')
    if not os.path.isdir(save_dir):os.makedirs(save_dir) 
    files = os.listdir(src_dir)
    print('-- ', len(files))
    #files.sort() 

    i = 0
    for file_name in files: 
        file_path = os.path.join(src_dir, file_name)

        # 执行shell 命令时,遇到括号可能执行失败。这里暴力解决:将文件保存在另一个名字下。
        if file_name.find('(') != -1:
            path1 = os.path.join(src_dir, file_name.replace('(', '_').replace(')', '_').replace(' ', '_').strip())
            shutil.move(file_path, path1)
            file_path = path1
 
        try:
            create_date = get_file_date(file_path)
            if create_date == None:continue
            suf = os.path.splitext(file_path)[-1]
# print(suf)
            save_path = os.path.join(save_dir, f'{create_date}{suf}') 
            if os.path.isfile(save_path):
                print('xx exist ', file_path, save_path) 
                continue

            i += 1
            if i%1000 == 1:print(i) 
            shutil.move(file_path, save_path)
        except Exception as err:
            print('xx ', err, file_path)


if __name__ == '__main__':
    
    src_dir = sys.argv[1]
    read_dir(src_dir)


伊织 2022-11-17(四)

你可能感兴趣的:(Python,python,mdls,macOS,iOS,照片)