python-将文件按日期分类

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()
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100249.html原文链接:https://javaforall.net

(0)
上一篇 2021年5月17日 下午7:00
下一篇 2021年5月17日 下午8:00


相关推荐

  • APP 签名

    APP 签名APP 签名 apk 签名的意义在于保证开发者的合法利益 每一个发布的 APP 签名都是唯一的 所以要求开发者再发布 APP 之前 必须拥有一个自己独立的签名 没有签名的 APP 上线不了 应用市场上 APP 签名不允许相同 也不会相同 但允许有相同的包名 相同签名的 APP 高版本可以覆盖低版本 欢迎使用 Markdown 编辑器你好 这是你第一次使用 Markdown 编辑器所展示的欢迎页 如果你想学习如何使用

    2026年3月19日
    1
  • c#线程的使用_线程定义

    c#线程的使用_线程定义Unity3d之截图方法分类: Unity3D2013-11-2817:13 1014人阅读 评论(2) 收藏 举报AnYuanLzhunityunity3d截屏下面是我总结的、在u3d中的,三种截屏方法:1、使用Application类下的CaptureScreenshot方法。[csharp] viewplaincopyvoid CaptureScreen()   {      App

    2022年10月16日
    6
  • 安装quagga与配置quagga ospf

    安装quagga与配置quagga ospfQuagga 安装首先要求探测机服务器能够连接外网源 Centos 能够使用外网 yum 源 Ubuntu 能够使用外网 apt 源 能够使用外网源直接下载运行相关软件 1 首先查看探测机服务器的系统类型 cat etc issue2 如果是 Centos RedHat 类系统 使用 yuminstall yquagga 命令安装 quagga 如果是 Ubuntu 系统 使用 sud

    2026年3月19日
    1
  • unix grep命令_grep命令实例

    unix grep命令_grep命令实例grep一般格式为:grep[选项]基本正则表达式[文件]这里基本正则表达式可为字符串。单引号双引号在grep命令中输入字符串参数时,最好将其用双引号括起来。在调用模式匹配时,应使用单引号。 例如:“mystring”。这样做有两个原因

    2022年8月30日
    7
  • oracle恢复被覆盖的存储过程

    oracle恢复被覆盖的存储过程

    2021年11月29日
    53
  • 2021年系统集成项目管理工程师(软考中级)连夜整理考前重点

    2021年系统集成项目管理工程师(软考中级)连夜整理考前重点第一章信息化基础知识一 信息与信息化 1 信息论奠基者香农认为 信息就是能够用来消除不确定性的东西 8 种状态需要 3 位比特表示 5 位比特则可表示 64 种状态信息 物质材料 能源是三大戓略资源 2 信息论两个层次 本体论和认识论 3 信息传输模型 信源 编码 信道 解码 信宿 其中噪声干扰的是信道 4 信息系统 6 大特点 目的性 可嵌套性 稳定性 开放性 脆弱性 健壮性 5 信息系统由硬件 软件 数据库 网络 存储设备 感知设备 外设 人员把数据处理成信息的规程等 6 信息系统生命周期可简化为

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号