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

背景需求

今天我用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 timeallFileNum = 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] == '.'):# 排除隐藏文件夹。因为隐藏文件夹过多passelse:# 添加非隐藏文件夹dirList.append(f)# mydir.append(path + '/' + f)if (os.path.isfile(path + '/' + f)):# 添加文件fileList.append(f)myfile.append(path + '/' + f)# 当一个标志使用,文件夹列表第一个级别不打印i_dl = 0for dl in dirList:if (i_dl == 0):i_dl = i_dl + 1else:# print("得到的文件夹",'-' * (int(dirList[-1])), dl)# 打印目录下的所有文件夹和文件,目录级别+1printPath((int(dirList[0])+1), path + '/' + dl)for fl in fileList:# print("得到的文件路径",'-' * (int(dirList[-1])), fl)# 随便计算一下有多少个文件allFileNum = allFileNum + 1def 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->bprint("-"*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:31folder_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("重复文件,略过")passelse: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 exifreadallFileNum = 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 allFileNumdirList = []fileList = []files = os.listdir(path)dirList.append(str(level))for f in files:if (os.path.isdir(path + '/' + f)):if (f[0] == '.'):passelse:dirList.append(f)if (os.path.isfile(path + '/' + f)):fileList.append(f)myfile.append(path + '/' + f)i_dl = 0for dl in dirList:if (i_dl == 0):i_dl = i_dl + 1else:printPath((int(dirList[0]) + 1), path + '/' + dl)for fl in fileList:allFileNum = allFileNum + 1def 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 subprocessvideo_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.stdoutcreation_time = metadata['format']['tags']['creation_time']return creation_time.split('T')[0]except (KeyError, IndexError):passreturn ""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.rhkb.cn/news/341871.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模式识别涉及的常用算法

一、线性回归 1.算法执行流程: 算法的执行流程可以简述如下: 导入必要的库: 导入NumPy库,用于数值计算。导入Matplotlib库,用于数据可视化。导入Pandas库,用于数据处理(尽管在这个例子中&#…

C语言基础学习之位运算

枚举类型 enum 枚举名 { 枚举常量 //名字 }; 注意: 1.c语言中 对于枚举类型 实际上是 当作整型处理的 2.提高代码可读性, 写成枚举,可以做语法检查 3.枚举常量,之间用逗号隔开 4.枚举常量,可以给初值,给了初值之后&…

Renesas MCU之SCI_SPI接口驱动LCD

目录 概述 1 软硬件介绍 1.1 软件版本信息 1.2 ST7796-LCD 1.3 MCU IO与LCD PIN对应关系 2 FSP配置项目 2.1 配置项目参数 2.2 生成项目框架 3 代码实现 3.1 SPI的库函数 3.1.1 R_SCI_SPI_Open() 3.1.2 R_SCI_SPI_Read() 3.1.3 R_SCI_SPI_Write() 3.2 应用函数…

CSS函数:scale、scale3d函数的使用

CSS函数scale()主要是为了实现元素的放大和缩小效果,使用的是元素的变换效果。使用的是元素的转换属性:transform的,该函数可以实现指定X轴和Y轴的放大、缩小效果。除此之外,我们还可以通过如下两种方式实现指定方向的转换&#x…

优化你的WordPress网站:内链建设与Link Whisper Pro插件的利用

文章目录 内链的重要性WordPress SEO插件:Link Whisper Pro主要功能使用指南下载与安装 结语 在数字营销和网站管理领域,SEO内部优化是提升网站排名、增加流量和提高用户参与度的核心策略。在众多SEO技巧中,内链建设是构建良好网站结构和提升…

SpringBoot定时任务+Quartz 动态调度

1、分部解释 2、完整代码 3、SpringBoot定时任务Quartz 1、动态定时任务: 动态定时任务,即定时任务的动态调度,可根据需求自由的进行任务的生成、暂停、恢复、删除和更新操作。Quartz本身没有提供动态调度的功能,需要自己根据相关的API开发。…

PostgreSQL专家(pcp51)--王丁丁

#PostgreSQL培训 #postgresql认证 #postgreSQL考试 #PG考试 #PG培训

【Linux】Linux工具——gdb

1. gdb 概述 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在 UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能…

记忆化搜索汇总

记忆化搜索简介 记忆化搜索(Memoization Search):是一种通过存储已经遍历过的状态信息,从而避免对同一状态重复遍历的搜索算法。 记忆化搜索是动态规划的一种实现方式。在记忆化搜索中,当算法需要计算某个子问题的结果…

面试题------>MySQL!!!

一、连接查询 ①:左连接left join (小表在左,大表在右) ②:右连接right join(小表在右,大表在左) 二、聚合函数 SQL 中提供的聚合函数可以用来统计、求和、求最值等等 COUNT&…

Docker配置 之 本地仓库web访问

介绍 Docker是一种开源的应用容器引擎。 Docker可以让开发者打包应用以及依赖包到一个可移植的容器中,然后发布到任何安装了Docker引擎的服务器上(包括Linux机器、Windows机器),也可以实现虚拟化。容器是完全使用沙箱机制&#…

【javaEE初阶】

🌈🌈🌈关于java ⚡⚡⚡java的由来 我们这篇文章主要是来介绍javaEE,一般称为java企业版,实际上java的历史可以追溯到上个世纪90年代,当时主要的语言主流的还是C语言和C,但是在那个时期嵌入式初…

js 一维数组转多维数组

效果图: //源数组const arrList [{"id": 1,"code": "001","name": "第一个","parentCode": "",},{"id": 2,"code": "00101","name": "第一…

使用gradio库实现Web应用,允许用户上传图像,并使用YOLOv8模型对图像进行目标检测。

一、Gradio Gradio 详细介绍 Gradio 是一个用于构建和分享机器学习模型和数据科学应用的开源Python库。它简化了创建交互式Web界面的过程,让开发者可以快速搭建原型并与他人分享。 主要特性 易用性: 无需前端开发经验:只需几行Python代码就…

【简单理解化】 内存函数及它的模拟实现

本文章谈论memcpy,memcmp,memmove,memset函数 目录 1.memcpy的使用和模拟实现 2.memmove的使用和模拟实现 3.memset的使用 4.memcmp函数的使用 1.memcpy的使用和模拟实现 该函数用于从源内存块复制指定数量的字节到目标内存块 1 void * memcpy ( void * destination, const voi…

DVWA-CSRF

CSRF Low 观察后端代码,只要password_new等于password_conf就可以修改密码。由于这两个参数是通过GET传递的,所以直接构造payload。 http://192.168.20.156/DVWA/vulnerabilities/csrf/?password_newpass&password_confpass&ChangeChange# 这…

Windows开启远程桌面

搜索并进入【远程桌面设置】 ​​ 开启远程桌面 ​​​ ipconfig​命令查看ip地址,并使用地址在另一台电脑远程登录此电脑 选择其他账户登录,输入用户和密码 ​​ ​​ 成功登录 ​​

判断经纬度是否在某个城市内

一、从高德获取指定城市边界经纬度信息 通过apifox操作&#xff1a; 二、引入第三方jar包&#xff1a; maven地址&#xff1a;https://mvnrepository.com/ maven依赖&#xff1a; <dependency><groupId>org.locationtech.jts</groupId><artifactId>…

Spring Boot整合Jasypt 库实现配置文件和数据库字段敏感数据的加解密

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

【全开源】Shopro社区团购(小程序版)

邻里间的购物新选择 基于Fastadmin后端管理系统Uniapp客户端&#xff08;仅支持微信小程序&#xff09;开发&#xff0c;生鲜果蔬社区团购的不二之选、快速搭建社区团购平台、让你的产品走进上千个社区。线上团购线下自提&#xff0c;玩转社区消费新模式提供专业、优质的社区团…