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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 全局钩子注入

    全局钩子注入全局钩子介绍hook,指利用api来提前拦截并处理windows消息的一种技术。如键盘钩子,许多木马都有这东西,监视你的键盘操作。全局钩子是系统钩子的一种,当指定的一些消息被系统中任

    2021年12月13日
  • python2022.01.13激活码-激活码分享2022.01.25

    (python2022.01.13激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • 分节符后页眉如何更改与上一节相同_页眉和页脚是什么

    分节符后页眉如何更改与上一节相同_页眉和页脚是什么不常编辑对文档有格式要求的朋友来说,偶尔需要编辑指定格式页眉页码的word文档时,会一时不记得如何使用,在网上搜索半天,异常烦躁。特整理一下,记录下来,备不时只需。以下操作环境为word2016。

  • pip命令使用详解「建议收藏」

    pip命令使用详解「建议收藏」pip很像CentOS系统中的yum命令,用于安装及维护Python包。pip的安装windows其实在windows下是默认安装了pip工具的,只是没有将其所在目录加入Path,导致命令查找不到。将python安装目录下的scripts目录加入环境变量Path中即可。Linux执行下面命令即可完成安装#wgethttps://bootstrap.pyp…

  • 拉姆达表达式是什么_拉姆达

    拉姆达表达式是什么_拉姆达Q:最近接触到Stream流式编程遇到了一些错误,故做一次总结复习用。一、λ表达式通常我们会用一个类实现接口,然后构造对象作为参数传入,也可以使用匿名类,用λ表达式可以简化匿名类的编写,用例如下。classWorkerimplementsRunnable{@Overridepublicvoidrun(){…

  • java查看线程数量_oracle线程数最大多少

    java查看线程数量_oracle线程数最大多少TOPtop-H-p{pid}我这里筛选的是java的进程对应的thread是33PSpshuHp{pid}|wc-l直接计数统计出来

发表回复

您的电子邮箱地址不会被公开。

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