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

news2025/1/19 3:39:25

背景需求

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

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

使用原来的日期分类代码

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

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修改代码内容。

代码展示:

'''
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 函数来获取视频文件的拍摄时间。如果最终无法获取到拍摄时间,则跳过处理该文件。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1790369.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记录Nuxt 3 官网项目的一次部署

本来以为就是一次简单的部署,之前也是部署过几次nuxt项目了,所以,并没有要记录的想法。但是过程出现了很多问题,最后考虑还是写下来吧。留个记录(完整的配置部署过程) 这里我将要说明两种部署方式以供选择&…

ingress规则

一 k8s 对外服务之 Ingress LB ingress 1 Ingress 简介 service的作用体现在两个方面 ? ① 对集群内部,它不断跟踪pod的变化,更新endpoint中对应pod的对象,提供了ip不断变化的pod的服务发现机制; ② 对集群外部&#xff0c…

针对硅基氮化镓高电子迁移率晶体管(GaN-HEMT)的准物理等效电路模型,包含基板中射频漏电流的温度依赖性

来源:Quasi-Physical Equivalent Circuit Model of RF Leakage Current in Substrate Including Temperature Dependence for GaN-HEMT on Si(TMTT 23年) 摘要 该文章提出了一种针对硅基氮化镓高电子迁移率晶体管(GaN-HEMT&…

逐步掌握最佳Ai Agents框架-AutoGen 九 RAG应用

在最近的几篇文章里,我们使用AutoGen实现了一些Demo。这篇文章,我们将使用AutoGen来完成RAG应用开发。 RAG应用 RAG全称"Retrieval-Augmented Generation",即检索增强生成,它是自然语言处理中的一项技术。这种模型结合了检索式&a…

【操作系统】(详细理解进程的状态)执行状态、就绪状态、阻塞状态、挂起状态

下面是进程的几种状态的概念: 执行状态:当一个进程已获得必要资源,并占有CPU进行执行。 就绪状体:进程已分配到除CPU外的所有必要资源,只要获取CPU允许就可立即执行。 阻塞状态:正在执行的进程,…

【NLP开发】Python实现聊天机器人(微信机器人)

🍺NLP开发系列相关文章编写如下🍺:1🎈【小沐学NLP】Python实现词云图🎈2🎈【小沐学NLP】Python实现图片文字识别🎈3🎈【小沐学NLP】Python实现中文、英文分词🎈4&#x1…

元宇宙3D品牌营销虚拟场景提升客户对企业的黏性

在这个充满创意与想象的3D元宇宙时代,我们为您推出了全新的3D元宇宙场景在线制作编辑平台,让您轻松构建专属的虚拟展厅,展现无限可能。 3D元宇宙场景在线制作编辑平台允许您快速完成空间设计,根据您的个性化需求,自由设…

云计算如何赋能工业数字化转型?

云计算在工业数字化转型中发挥着至关重要的作用,通过提供安全的数据存储与备份、强大的数据处理和分析能力、以及降低IT成本,为企业的数字化转型提供了坚实的技术支撑,助力企业实现数字化转型目标。 一、什么是云计算技术?有哪些基…

连锁品牌企业的税务策略,创业者的盈利秘籍!

随着全球经济的不断发展,连锁品牌企业已成为商业竞争中的重要力量。然而,在追求利润最大化的道路上,税务策略成为了企业不容忽视的一环。商淘云和你一起探讨连锁品牌企业的税务策略及创业者的盈利秘籍,着重介绍税务合规管理、税务…

适合初学者人手一本的LLM大语言模型综述,爆火全网

今天给大家推荐一本大模型(LLM)这块的一本外文书,经过整理已经出中文版了,就是这本《大型语言模型综述》!本书在git上有9.2k star,还是很不错的一本大模型方面的书。 本教程内容主要内容:中文版…

防火墙是什么?探讨部署Web防火墙的必要性

如今,多云环境、API安全功能扩展、合作伙伴集成即时可用、可用性和可视化增强以及提高自动化程度已经成为基本要求。伴随企业应用架构的迁移,在用户端,需要在部署环境不断扩展但人员技能有限的情况下,保护数量日益增长的应用安全。…

libsystemctlm-soc项目分析

概述 libsystemctlm-soc项目是Xilinx的SystemC库。 环境安装 verilator安装 # Prerequisites: #sudo apt-get install git help2man perl python3 make autoconf g flex bison ccache #sudo apt-get install libgoogle-perftools-dev numactl perl-doc #sudo apt-get insta…

vulhub中PHP利用GNU C Iconv将文件读取变成RCE(CVE-2024-2961)

GNU C 是一个标准的ISO C依赖库。在GNU C中,iconv()函数2.39及以前存在一处缓冲区溢出漏洞,这可能会导致应用程序崩溃或覆盖相邻变量。 如果一个PHP应用中存在任意文件读取漏洞,攻击者可以利用iconv()的这个CVE-2024-2961漏洞,将…

Ubuntu20.04 Mysql基本操作知识

#Mysql基本知识 运行环境Ubuntu20.04 1.开启mysql服务 sytemctl start mysql不然,命令行进入myql交互行提交命令后,就会出现4200错误。 2.显示所有数据库 SHOW DATABASES;注意复数s,毕竟很多数据库 3.新建数据库test CREATE DATABASE …

算法训练营第四十六天 | 卡码网52 携带研究材料、LeetCode 518 零钱兑换II、LeetCode 377 组合总和IV

写在前面 这次算法训练营题目,其实完全是按照代码随想录一路跟着来的,上面也有更好的、讲得更清楚的题解,有需要的小伙伴可以去那里看。 我这里是之前已经大体刷过一遍,为了应对有可能会考到的面试题,现在在跟着一个专…

WordPress电脑版+手机版自动识别切换主题插件优化版

下载地址:WordPress电脑版手机版自动识别切换主题插件优化版 插件介绍: 电脑访问自动显示电脑版 手机访问自动显示手机版

Python编程学习第一篇——制作一个小游戏休闲一下

到上期结束,我们已经学习了Python语言的基本数据结构,除了数值型没有介绍,数值型用的非常广,但也是最容易理解的,将在未来的学习中带大家直接接触和学习掌握。后续我们会开始学习这门语言的一些基础语法和编程技巧,在这之前我们休闲一下,写一个小游戏娱乐一下。 小戏用…

深入理解可燃气体报警器检验标准:守护工业安全新举措

在工业生产领域,可燃气体报警器扮演着至关重要的角色。它能在气体浓度达到危险水平之前发出警报,为工作人员争取宝贵的逃生时间。 为了确保可燃气体报警器的准确性和可靠性,我们需要遵循一系列严格的检验标准。 在这篇文章中,佰…

TCP协议的核心机制

TCP协议的核心机制 一:确认应答机制1.2:超时重传接收缓冲区 超时重传时间重置连接 一:确认应答机制 对于TCP协议来说,要解决的一个很重要的问题,就是可靠传输 可靠传输,不是指发送方能够100%的把数据发送给接收方,而是尽可能. 尤其是让发送方知道,接收方是否收到. 举个例子: …

AI菜鸟向前飞 — LangChain系列之十六 - Agent系列:从现象看机制(下篇)一款“无需传递中间步骤“的Agent

前言 AI菜鸟向前飞 — LangChain系列之十四 - Agent系列:从现象看机制(上篇) AI菜鸟向前飞 — LangChain系列之十五 - Agent系列:从现象看机制(中篇)一个Agent的“旅行” 回顾前两篇文章,大家会…