python-将文件按日期分类

问题

小米云盘只有5G,不经意间存了一些乱七八糟的东西,我希望将他们全部下载后然后清空小米云盘,这样小米云就不会偷偷地把一些我已经删掉的资料再同步给我的手机。
导致删不敢删,留着也烦人。我不希望那些公司玩弄我的资料。
下载后的文件自动按照时间分类创建一系列的文件夹分别存入下载的内容。
数千个文件按时间以及格式归类创建文件夹

解决

整体逻辑是读取所有的文件名字,找到文件后读取创建日期,格式信息,如果这个日期文件夹比如2020-2-1已经存在,再判断目标文件夹是否有重复文件,满足条件则将文件移入。否则创建一个新的创建日期的文件夹,然后移动入

成功截图

我要移动的文件有数千个,已经成功过了,因此这里放了一个测试的案例图片,只有两个文件。
在这里插入图片描述
在这里插入图片描述

读取文件的创建时间

os.stat() 方法
os.stat() 方法用于在给定的路径上执行一个系统 stat 的调用。
st_mode: inode 保护模式
st_ino: inode 节点号。
st_dev: inode 驻留的设备。
st_nlink: inode 的链接数。
st_uid: 所有者的用户ID。
st_gid: 所有者的组ID。
st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。
st_atime: 上次访问的时间。
st_mtime: 最后一次修改的时间。
st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。

import os
import time
import datetime
def TimeStampToTime(timestamp):
    timeStruct = time.localtime(timestamp)
    return time.strftime('%Y-%m-%d %H:%M:%S',timeStruct)
imgPath = r'C:\Users\Administrator.DESKTOP-KMH7HN6\Desktop\need_main\temp\截屏\IMG_20210110_100531.jpg'
# ImageDate = datetime.datetime.strftime(time.ctime(os.stat(imgPath).st_mtime), "%Y-%m-%d %H:%M:%S")
a=os.stat(imgPath).st_mtime
print(TimeStampToTime(a))#2021-01-10 10:05:31
# print(ImageDate)

移动文件

import os,shutil
a=r"C:\Users\Administrator.DESKTOP-KMH7HN6\Desktop\111\a\1 (1).jpg"
b=r"C:\Users\1 (1).jpg"
shutil.move(a,b)#a->b

判断目录是否存在

import os
dirs = '/Users/'

if not os.path.exists(dirs):
    os.makedirs(dirs)

判断是否是重复文件

import os
filename = '/Users/p.txt'

if not os.path.exists(filename):
    os.system(r"touch {}".format(path))#调用系统命令行来创建文件

这个是判断文件是否存在的,肯定不对。
思路是得到文件夹下所有文件名字,然后用列表包含判断

        if filename in os.listdir(new_dir):
            print("重复文件,略过")
            pass
        else:
            move_file(new_dir)

创建文件夹

def manager_folders(path):
    if os.path.exists(path):
        pass
    else:
        os.makedirs(path)

遍历所有文件


import os
allFileNum = 0
myfile=[]
mydir=[]
def printPath(level, path):
    global allFileNum
    ''''' 
    打印一个目录下的所有文件夹和文件 
    '''
    # 所有文件夹,第一个字段是次目录的级别
    dirList = []
    # 所有文件
    fileList = []
    # 返回一个列表,其中包含在目录条目的名称(google翻译)
    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)
                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[0])), dl)
            # 打印目录下的所有文件夹和文件,目录级别+1
            printPath((int(dirList[0]) + 1), path + '/' + dl)
    for fl in fileList:
        # print("得到的文件路径",'-' * (int(dirList[0])), fl)
        # 随便计算一下有多少个文件
        allFileNum = allFileNum + 1
myfirstpath = r"C:/Users/Administrator.DESKTOP-KMH7HN6/Desktop/111"
printPath(1, myfirstpath)
print(myfile)

因此综合得到整体代码


import os,shutil
import time
import datetime
allFileNum = 0
myfile=[]
mydir=[]
this_folder=input("原始路径:").replace("\\",'/')
those_folder=input("目标路径:").replace("\\",'/')
def printPath(level, path):
    global allFileNum
    '''''
    打印一个目录下的所有文件夹和文件
    '''
    # 所有文件夹,第一个字段是次目录的级别
    dirList = []
    # 所有文件
    fileList = []
    # 返回一个列表,其中包含在目录条目的名称(google翻译)
    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)
                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[0])), dl)
            # 打印目录下的所有文件夹和文件,目录级别+1
            printPath((int(dirList[0]) + 1), path + '/' + dl)
    for fl in fileList:
        # print("得到的文件路径",'-' * (int(dirList[0])), 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 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
    #得到文件创建时间,判断文件夹是否存在
    creat_time=TimeStampToTime(a)[:-9]
    print(creat_time) #str 2021-01-10 10:05:31
    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()

升级版,不仅按照日期,也按照格式进一步分类


import os,shutil
import time
import datetime
allFileNum = 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=input("原始路径:").replace("\\",'/')
those_folder=input("目标路径:").replace("\\",'/')
def printPath(level, path):
    global allFileNum
    '''''
    打印一个目录下的所有文件夹和文件
    '''
    # 所有文件夹,第一个字段是次目录的级别
    dirList = []
    # 所有文件
    fileList = []
    # 返回一个列表,其中包含在目录条目的名称(google翻译)
    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)
                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[0])), dl)
            # 打印目录下的所有文件夹和文件,目录级别+1
            printPath((int(dirList[0]) + 1), path + '/' + dl)
    for fl in fileList:
        # print("得到的文件路径",'-' * (int(dirList[0])), 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]
        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
    #得到文件创建时间,判断文件夹是否存在
    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)
    #不存在文件夹则创建文件夹
    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()
  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用Python的PIL库(Python Imaging Library)来读取照片的Exif信息,其中包含了照片的拍摄日期。然后可以使用shutil库来将照片移动到对应的文件夹中,以实现按拍摄日期整理分类。 以下是一个简单的示例代码: ```python import os import shutil from PIL import Image # 遍历指定目录下的所有照片文件 for filename in os.listdir('path/to/photos'): if filename.endswith('.jpg') or filename.endswith('.jpeg'): filepath = os.path.join('path/to/photos', filename) # 读取照片的Exif信息 with Image.open(filepath) as img: exif = img._getexif() if exif: # 获取拍摄日期 date_str = exif.get(36867) if date_str: # 将日期格式化为yyyy-mm-dd date = '-'.join(date_str.split(' ')[0].split(':')) # 创建目标文件夹并移动照片 target_dir = os.path.join('path/to/sorted_photos', date) os.makedirs(target_dir, exist_ok=True) shutil.move(filepath, os.path.join(target_dir, filename)) ``` 在上述代码中,`path/to/photos`是存放原始照片的目录,`path/to/sorted_photos`是存放按拍摄日期整理分类后的照片的目录。通过遍历原始照片目录下的所有照片文件,并读取其Exif信息,获取照片的拍摄日期,然后将照片移动到以拍摄日期为名称的目录中。如果目标文件夹不存在,则会自动创建。 ### 回答2: 使用Python对照片进行按拍摄日期整理分类可通过以下步骤实现: 1. 导入所需的Python模块,如os、shutil等。 2. 使用os模块获取文件夹中的所有文件。 3. 循环遍历每个文件,使用os.path模块获取文件的创建时间或修改时间。 4. 转换时间格式为指定的年月日格式。 5. 创建以年月日为名称的文件夹,通过os模块创建文件夹。 6. 使用shutil模块将文件移动到对应的年月日文件夹中。 7. 完成整理分类后,输出提示信息。 下面是一个简单的示例代码: ```python import os import shutil # 获取文件夹路径 folder_path = "照片文件夹路径" # 遍历文件夹中的文件 for filename in os.listdir(folder_path): # 获取文件的创建时间 creation_time = os.path.getctime(os.path.join(folder_path, filename)) # 转换时间格式为年月日 date = time.strftime("%Y%m%d", time.localtime(creation_time)) # 创建以年月日为名称的文件夹 new_folder_path = os.path.join(folder_path, date) os.makedirs(new_folder_path, exist_ok=True) # 移动文件到对应的文件夹中 shutil.move(os.path.join(folder_path, filename), os.path.join(new_folder_path, filename)) print("照片已按拍摄日期整理分类完成!") ``` 需要注意的是,以上示例代码的前提是照片文件的元数据中包含了拍摄日期信息,如果照片文件没有拍摄日期信息,可以使用其他方式来获取拍摄日期,例如根据文件名或其他标识信息来判断和分类。 ### 回答3: 使用Python对照片按拍摄日期进行整理分类是非常简单的。首先,我们需要安装PIL库来处理图像。 首先,我们需要通过使用PIL库中的`Image.open()`函数打开图片文件。然后,我们可以使用`_getexif()`方法获取图像的元数据,其中包含了拍摄日期等信息。接下来,我们可以使用`DateTimeOriginal`键来提取拍摄日期。 接下来,我们可以使用`os`库的一些函数来创建和移动目录。首先,我们需要将所有图片移动到同一个文件夹中,然后创建一个用于存储分类后的照片的目录。 接下来,我们可以使用`glob`库的函数来获取所有文件夹中的照片文件。然后,我们可以使用之前获得的拍摄日期来将这些照片分类。 最后,我们可以使用`shutil`库的`move()`函数将每张照片移动到相应的目录中。 下面是一个简单的示例代码: ``` import os import glob import shutil from PIL import Image # 创建一个目录来存储分类后的照片 output_directory = '分类后的照片' os.makedirs(output_directory, exist_ok=True) # 获取所有的照片文件 photo_files = glob.glob('*.jpg') for photo_file in photo_files: photo = Image.open(photo_file) exif_data = photo._getexif() # 从元数据中获取拍摄日期 if 36867 in exif_data: capture_date = exif_data[36867] # 将日期格式化为年份和月份 year = capture_date[:4] month = capture_date[5:7] # 创建分类后的目录 output_directory_year = os.path.join(output_directory, year) output_directory_month = os.path.join(output_directory_year, month) os.makedirs(output_directory_year, exist_ok=True) os.makedirs(output_directory_month, exist_ok=True) # 移动照片到分类后的目录中 shutil.move(photo_file, output_directory_month) ``` 以上就是使用Python对照片按拍摄日期进行整理分类的简单示例代码。请注意,在使用之前,你需要将示例代码中的`*.jpg`替换为你照片的文件名模式,并确保你已经安装了相关的库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值