【办公类-04-02】华为助手导出照片读取拍摄时间分类导出,视频不行)

背景需求

今天我用QQ相册导出照片,但是始终在转圈,手机上无法跳出"连结""的提示,换了台式和笔记本都无法传输。(明明5月14日还可以导出的)

最后我只能用华为传输助手,把照片快速提取出来了。

使用原来的日期分类代码

【办公类-04】VS python手机照片视频按日期文件夹整理_视频按日期分类-CSDN博客文章浏览阅读1.7k次,点赞2次,收藏2次。【办公类-04】VS python手机照片视频按日期文件夹整理_视频按日期分类https://blog.csdn.net/reasonsummer/article/details/122583051

python 复制代码
import datetime
import os
import shutil
import time

allFileNum = 0# 所有文件数量从0开始
myfile=[]# 我的文件
mydir=[]# 我的列表
movie_file_format=['avi','mpeg','mp4','mov','ProRes','DNxHR','mfx','mkv','wmv','flv','rmvb','webm','asf']# 视频格式
text_file_format=['DOC','PDF','HTML','TXT','HTL','DOCX']# 文本格式
img_file_format=['bmp','jpg','jpeg','png','tif','gif','pcx','tga','exif','fpx','svg','psd',
                 'cdr','pcd','dxf','ufo','eps','ai','raw','WMF','webp','avif','hdri','flic','emf','ico']# 图片格式
zip_file_format=['rar' ,'zip','7z','CAB','ARJ','LZH','TAR','GZ','ACE','UUE','BZ2','JAR','ISO','MPQ']# 压缩格式
music_file_format=['PCM','WAV','AIFF','MP3','AAC','OGG','WMA','FLAC','ALAC','WMA']# 音乐格式


this_folder= 'D:\\03照片导出' # 整理前的照片所在文件夹,原始路径:
# this_folder=input("原始路径:").replace("\\",'/')
those_folder='D:\\04照片整理'# 整理后的照片所在文件夹(原照片删除),目标路径:
# those_folder=input("目标路径:").replace("\\",'/')

def printPath(level, path):# 定义输出路径(层级,路径字符串)
    global allFileNum    # 返回allFileNum的全局变量
    '''''
    打印一个目录下的所有文件夹和文件
    '''
    # 所有文件夹,第一个字段是次目录的级别
    dirList = []    # 目录清单
    # 所有文件
    fileList = []
    # 返回一个列表,其中包含在目录条目的名称(google翻译)
    files = os.listdir(path)
    # 先添加目录级别
    dirList.append(str(level))
    for f in files:
        if (os.path.isdir(path + '/' + f)):  # os.path.isdir()用于判断对象是否为一个目录
            if (f[0] == '.'):# 排除隐藏文件夹。因为隐藏文件夹过多
                pass
            else:
                # 添加非隐藏文件夹
                dirList.append(f)
                # mydir.append(path + '/' + f)
        if (os.path.isfile(path + '/' + f)):
            # 添加文件
            fileList.append(f)
            myfile.append(path + '/' + f)
    # 当一个标志使用,文件夹列表第一个级别不打印
    i_dl = 0
    for dl in dirList:
        if (i_dl == 0):
            i_dl = i_dl + 1
        else:
            # print("得到的文件夹",'-' * (int(dirList[-1])), dl)
            # 打印目录下的所有文件夹和文件,目录级别+1
            printPath((int(dirList[0])+1), path + '/' + dl)
    for fl in fileList:
        # print("得到的文件路径",'-' * (int(dirList[-1])), fl)
        # 随便计算一下有多少个文件
        allFileNum = allFileNum + 1
 
def judge_file(oldPath,location):    # 定义判断文件(老文件,位置)
    def TimeStampToTime(timestamp):# 定义时间转戳时间(时间戳)
        timeStruct = time.localtime(timestamp)#时间结构体等于,格式化时间戳为本地的时间(时间戳)
        return time.strftime('%Y-%m-%d %H:%M:%S', timeStruct)#返回本地时间戳(结构累心,时间结构体)
    def get_file_format(file_path):        # 定义获取后的文件格式(文件路径)
        file_name=file_path.split("/")[-1]        #文件名称等于 文件路径 的最后一段 split("/")[-1]  以'/ '为分割f符,保留最后一段
        # if file_name.find(".")>0:
        #     file_format=file_name.split('.')[-1] #文件名称等于 文件路径 的最后一段
        #     if file_format.lower() in movie_file_format or file_format.upper() in movie_file_format:
        #         return "视频"
        #     # elif file_format.lower() in text_file_format or file_format.upper() in text_file_format:
        #     #     return "文本"
        #     elif file_format.lower() in img_file_format or file_format.upper() in img_file_format:
        #         return "图片"
        #     elif file_format.lower() in music_file_format or file_format.upper() in music_file_format:
        #         return "音频"
        #     elif file_format.lower() in zip_file_format or file_format.upper() in zip_file_format:
        #         return "压缩"
        #     else:
        #         return "其他"  
        # else:
        #     return "文本"
    def move_file(new_dir):#定义转移文件 新的列表
        old_file_name = oldPath.split("/")[-1]#老文件名等于老路径的最后一段
        # 将文件移动到新文件夹
        shutil.move(oldPath, new_dir + '/' + old_file_name)  # a->b
        print("-"*50+"已完成:%.2f" % ((location + 1) / allFileNum*100))
    # ImageDate = datetime.datetime.strftime(time.ctime(os.stat(imgPath).st_mtime), "%Y-%m-%d %H:%M:%S")
    a = os.stat(oldPath).st_mtime    # 文件时间戳 os.stat(老路径文件).st_mtime
    #得到文件创建时间,判断文件夹是否存在
    creat_time=TimeStampToTime(a)[:-9]
    # 创造时间戳
    print(creat_time) #打印创造的时间 str 2021-01-10 10:05:31
    folder_format=get_file_format(oldPath)
    # 新列表展示为三段式结构------整理后的路径(一级文件夹),创造的时间(二级文件夹),文件格式(图片 视频等 三级文件夹)
    # new_dir="%s/%s/%s"%(those_folder,creat_time,folder_format)    
    # 阿夏需要两级文件夹(整理后的路径(一级文件夹),创造的时间(二级文件夹)里面装了混合的照片和视频。手动整理)
    new_dir="%s/%s"%(those_folder,creat_time)
  
    #不存在文件夹则创建文件夹
    if not os.path.exists(new_dir):
        os.makedirs(new_dir)
        move_file(new_dir)
    #如果存在就判断是否是重复文件
    else :
        if oldPath.split("/")[-1] in os.listdir(new_dir):
            print("重复文件,略过")
            pass
        else:
            move_file(new_dir)
def do_all():
    for i in myfile:
        judge_file(i,myfile.index(i))
printPath(1, this_folder)
do_all()
input()
# ------------------------------------------------
# 版权声明:本文为CSDN博主「lidashent」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
# 原文链接:https://blog.csdn.net/lidashent/article/details/113919375

结果只出现一个文件夹。(从4月26-6月4日)

发现程序可能按照"修改日期"整理文件了,而不是按照拍摄日期整理

华为助手导出照片,按照创建日期生成了,我需要按照拍摄日期文件夹整理)让AI修改代码内容。

代码展示:

python 复制代码
'''
QQ相册导出失灵后,使用华为助手导出照片,结果4月28日-6月4日的照片都打包在6月4日文件夹里
运用AI对话大师将原来的代码进行修改。实现按如期分类

华为手机助手导出的照片,指定读取拍摄时间(只能转移照片,视频不行)
作者:AI对话大师
时间:2024年6月4日


'''


import os
import shutil
import exifread

allFileNum = 0
myfile = []
mydir = []
img_file_format = ['bmp', 'jpg', 'jpeg', 'png', 'tif', 'gif', 'pcx', 'tga', 'exif', 'fpx', 'svg', 'psd',
                   'cdr', 'pcd', 'dxf', 'ufo', 'eps', 'ai', 'raw', 'WMF', 'webp', 'avif', 'hdri', 'flic', 'emf', 'ico']
video_file_format = ['avi', 'mpeg', 'mp4', 'mov', 'ProRes', 'DNxHR', 'mfx', 'mkv', 'wmv', 'flv', 'rmvb', 'webm', 'asf']
text_file_format = ['DOC', 'PDF', 'HTML', 'TXT', 'HTL', 'DOCX']
# 添加其他文件类型列表

this_folder = 'D:\\03照片导出'
those_folder = 'D:\\04照片整理'

def printPath(level, path):
    global allFileNum
    dirList = []
    fileList = []
    files = os.listdir(path)
    dirList.append(str(level))
    for f in files:
        if (os.path.isdir(path + '/' + f)):
            if (f[0] == '.'):
                pass
            else:
                dirList.append(f)
        if (os.path.isfile(path + '/' + f)):
            fileList.append(f)
            myfile.append(path + '/' + f)
    i_dl = 0
    for dl in dirList:
        if (i_dl == 0):
            i_dl = i_dl + 1
        else:
            printPath((int(dirList[0]) + 1), path + '/' + dl)
    for fl in fileList:
        allFileNum = allFileNum + 1

def get_file_format(file_path):
    file_name = file_path.split("/")[-1]
    file_format = file_name.split('.')[-1]
    if file_format.lower() in img_file_format:
        return ""
    elif file_format.lower() in video_file_format:
        return ""
    elif file_format.lower() in text_file_format:
        return ""
    # 添加其他文件类型判断条件
    else:
        return ""

def move_file(oldPath, new_dir):
    old_file_name = oldPath.split("/")[-1]
    shutil.move(oldPath, new_dir + '/' + old_file_name)
    print("-" * 50 + "已完成:%.2f" % ((myfile.index(oldPath) + 1) / allFileNum * 100))

def get_create_time(file_path):
    with open(file_path, 'rb') as f:
        tags = exifread.process_file(f)
        if 'EXIF DateTimeOriginal' in tags:
            datetime_original = tags['EXIF DateTimeOriginal']
            return str(datetime_original).split()[0].replace(":", "-")
    return ""

def judge_file(oldPath, location):
    create_time = get_create_time(oldPath)
    if create_time:
        folder_format = get_file_format(oldPath)
        new_dir = "%s/%s/%s" % (those_folder, create_time, folder_format)
        if not os.path.exists(new_dir):
            os.makedirs(new_dir)
        move_file(oldPath, new_dir)
    else:
        print("无法获取拍摄日期,跳过文件:" + oldPath)

def do_all():
    for i in myfile:
        judge_file(i, myfile.index(i))

printPath(1, this_folder)
do_all()
input()

import os
import subprocess

video_file_format = ['avi', 'mpeg', 'mp4', 'mov', 'ProRes', 'DNxHR', 'mfx', 'mkv', 'wmv', 'flv', 'rmvb', 'webm', 'asf']

def get_video_create_time(file_path):
    if file_path.split('.')[-1].lower() not in video_file_format:
        return ""
    
    command = ['ffprobe', '-v', 'quiet', '-print_format', 'json', '-show_format', file_path]
    result = subprocess.run(command, capture_output=True, text=True)
    
    if result.returncode == 0:
        try:
            metadata = result.stdout
            creation_time = metadata['format']['tags']['creation_time']
            return creation_time.split('T')[0]
        except (KeyError, IndexError):
            pass
    
    return ""

def judge_file(oldPath, location):
    create_time = get_create_time(oldPath)
    if not create_time:
        create_time = get_video_create_time(oldPath)
    
    if create_time:
        folder_format = get_file_format(oldPath)
        new_dir = "%s/%s/%s" % (those_folder, create_time, folder_format)
        if not os.path.exists(new_dir):
            os.makedirs(new_dir)
        move_file(oldPath, new_dir)
    else:
        print("无法获取拍摄时间,跳过文件:" + oldPath)

# 在 judge_file 函数中添加了对视频文件的处理。首先,我们尝试使用 get_create_time 函数获取拍摄时间。如果获取不到,则调用 get_video_create_time 函数来获取视频文件的拍摄时间。如果最终无法获取到拍摄时间,则跳过处理该文件。

看看是否可以想办法读取照片、视频的文件名,将图片、视频进行剪切转移黏贴。

相关推荐
数据智能老司机30 分钟前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机2 小时前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机2 小时前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机2 小时前
精通 Python 设计模式——性能模式
python·设计模式·架构
c8i2 小时前
drf初步梳理
python·django
每日AI新事件2 小时前
python的异步函数
python
这里有鱼汤3 小时前
miniQMT下载历史行情数据太慢怎么办?一招提速10倍!
前端·python
databook12 小时前
Manim实现脉冲闪烁特效
后端·python·动效
程序设计实验室12 小时前
2025年了,在 Django 之外,Python Web 框架还能怎么选?
python
倔强青铜三14 小时前
苦练Python第46天:文件写入与上下文管理器
人工智能·python·面试