python遍历文件夹并按日期排列文件

4 篇文章 0 订阅

说到用python遍历文件,首要会想到os.walk(),这是错的,好吧,也没有很错。。。。反正把我累到了
废话乱说,上代码

from datetime import date, datetime
import os

def cft(filepath):
    sub=[]
    sub1=[]

    for f,sf,file in os.walk(filepath,topdown=False):
                    
                    for ff in file:
                        sub1.append(f)
                        sub.append(os.path.join(f,ff))
    
    a=0                 
    dictd={}
    
    newsub=sorted(sub)
    newsub1=sorted(sub1)

    for y in range(len(sub1)):

        subf=newsub1[y]
        try:
            dictd[subf]
            
        except:
            
            dictd[subf]={}
            dictd[subf]['files']=[]
            dictd[subf]['date']=[]

        dictd[subf]['files'].append(newsub[y])
        dictd[subf]['date'].append(os.path.getmtime(newsub[y]))

    return sub1,dictd
    
    
    
def sort_by_datetime(subfolders,dictt):
    newdict={}
    newdictwithdate={}#带时间的表达方式,懒得写
    
    if len(subfolders)>1:
        sub=sorted(list(set(subfolders)))
        print(sub)
        for i in sub:
            j=dictt[i]
            
            
            tempsortdate=sorted(j['date'])
            newdict[i]={}
            newdict[i]['files']=[]
            for k in tempsortdate:
                idx=j['date'].index(k)

                newdict[i]['files'].insert(idx,j['files'][idx])

            newdict[i]['sortdate']=tempsortdate
            tempsortdate=[]#加入新排序后的子路径后把暂存清空
    else:
        pass#如果没有subfolder...懒得写
    return newdict


sub,dictd=cft('C:\\Users\\kt.si\\Downloads\\a\\')

dicte=sort_by_datetime(sub,dictd)


import pprint
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(dicte)

吐槽一下,os.walk出来的文件是乱序的,乱到不行那种,所以要做sorted,sorted 之后组一个字典,再放到sort_by_datetime做一下[‘date’]顺序和再把索引置换一下[‘files’]的顺序,再生成新的字典

好像挺繁复的,搞了我很久,但其实根本不太需要做的这么麻烦

所以通常大佬骂过,用 os.listdir(),os.popen()它不更香吗,废话乱说,看下面

os.listdir() 方法

def loopfolderstreeuselistdir(fpath,folders=[],dird=[],dd=[]):
    
    cc=[]
    
    t=True
    
    if fpath is None:    
        for i in folders:
            dird=os.listdir(i)
            cc=[os.path.join(i,j) for j in dird]
            dd=dd+cc
            cc=[]
    else:
        dd=os.listdir(fpath)
        dd=[os.path.join(fpath,i) for i in dd]
    
    for i in dd:
        if not os.path.isfile(i):
            folders.append(i)
            t=False
        else:
            t=True
            #文件部分,日期排序可以使用sort_by_datetime()改改就好不用太注意细节了
            # try:
                    
                    # dictt[path]['files']
                # except:
                    # dictt[path]={}
                    # dictt[path]['files']=[]
                # dictt[path]['files'].append(k)
                # dictt[path]['files']=sorted(list(set(dictt[path]['files'])))
    if t==True:
        return sorted(list(set(folders)))
        
    return loopfolderstreeuselistdir(None,folders)


fpath='C:\\Users\\kt.si\\Downloads\\a\\'
folders=loopfolderstreeuselistdir(fpath)
###with dict
# print(folders)
# import pprint
# pp = pprint.PrettyPrinter(indent=4)
# pp.pprint(dictt)

##os.popen() 方法

def cmddir_listdir(fpath):
    dd=os.popen(f'dir /s {fpath}').read()
    dictt={}
    files=[]
    dirdd=''
    def get_files_withdate(line,dirdd):

        
        

        if line.find('的目錄')>-1:#系统是繁体,所以这三个字也就是繁体咯
            dirdd=str().join(line[:-4])
            dictt[dirdd]={}
            # print(dirdd)
        else:
   
            y=str().join(line.split(' ')[-1])
            x=os.path.join(dirdd,y)
            
            
            
       
            
            if os.path.isfile(x.strip()):
                 # 因为输出已经不是乱序,而且时间标识出来,所以比较简单,只需要在这里获取就可以了
                date=str().join(line.split(' ')[0:5])
                try:
                    
                    dictt[dirdd]['files']
                    
                except:
                    dictt[dirdd]['files']=[]
                    dictt[dirdd]['date']=[]
                dictt[dirdd]['files'].append(x.strip())
                dictt[dirdd]['date'].append(date.strip())
        return dirdd,dictt
                
                
    
          
    for i in dd.split('\n')[:-4]:
        
        dirdd,dictt=get_files_withdate(i,dirdd)
    return dictt

dictt=cmddir_listdir(fpath)

pp = pprint.PrettyPrinter(indent=4)
pp.pprint(dictt)
  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值