遍历文件夹

os.walk(指定的绝对路径或相对路径) 可以把文件夹里的文件里……的文件都找出来

import os
#os.walk(绝对路径或相对路径)
for dirpath , dirname , file in os.walk('./'):
    print(f'发现文件夹{dirpath}')
    print(file)

输出结果:

发现文件夹./
 [‘exercise210217.py’, ‘for循环练习1-4.py’, ‘pa.py’, ‘sublime_test.py’, ‘test1.py’, ‘test2.py’, ‘test8_2.py’, ‘test8_4.py’, ‘test8_4_2.py’, ‘test8_5_1.py’, ‘work2.py’, ‘work2.rar’, ‘个人所得税.py’, ‘个人所得税.rar’, ‘游戏.py’, ‘游戏.rar’]
 发现文件夹./这是个空文件夹
 []
 dirpath:文件夹路径
 dirname:是dirpath文件夹下子文件夹列表
 file:是dirpath文件夹下文件列表

搜索、匹配文件名称

利用字符串内置的搜索开头字符或结尾字符方法
.startswich()
.endswich()

print('abc.txt'.startswich('ab'))
print('abc.txt'.endswich('.txt'))

字符串A.startswich(字符串B):字符串A是否以字符串B开头
字符串A.endswich(字符串B):字符串A是否以字符串B结尾

glob模块
glob.golb()

模式

意义

*

匹配所有


匹配任何单个字符

[seq]

匹配seq中的任何字符

[!seq]

匹配任何不在seq中的字符

import glob
print(glob.glob('*.py'))

输出结果:

[‘exercise210217.py’, ‘for循环练习1-4.py’, ‘pa.py’, ‘sublime_test.py’, ‘test1.py’, ‘test2.py’, ‘test8_2.py’, ‘test8_4.py’, ‘test8_4_2.py’, ‘test8_5_1.py’, ‘work2.py’, ‘个人所得税.py’, ‘游戏.py’]
 结果以列表方式输出


‘*’号表示可以是任意字符

import glob
print(glob.glob('le*1.py'))

输出结果:[lesson1.py]
寻找以le开头l结尾的py文件

搜索当前文件夹下包含子文件夹下的文件

import glob
print(glob.glob('**/*.py',recursive = True))

输出结果:

[‘exercise210217.py’, ‘for循环练习1-4.py’, ‘pa.py’, ‘sublime_test.py’, ‘test1.py’, ‘test2.py’, ‘test8_2.py’, ‘test8_4.py’, ‘test8_4_2.py’, ‘test8_5_1.py’, ‘work2.py’, ‘个人所得税.py’, ‘游戏.py’, ‘这是个空文件夹\none.py’, ‘这是个空文件夹\空文件夹\glob.py’]
glob.glob(’**/*.py’,recursive = True)
用 **表示任意层文件夹或文件
 recursive = True 会不断进入文件夹内

fnmatch模块
可以用来匹配文件名

import fnmatch
print(fnmatch.fnmatch('test1.py','te*1.py'))
print(fnmatch.fnmatch('test1.py','test[0-9].py'))

输出结果:
True
True
如果文件夹中存在前面的文件就返回True

查询文件信息
os.scandir()返回的文件都可以查询信息

import os
for file in os.scandir():
	print(file.name,file.stat())

输出结果:
exercise210217.py os.stat_result(st_mode=33206, st_ino=0, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=922, st_atime=1613565836, st_mtime=1613565836, st_ctime=1613559731)
for循环练习1-4.py os.stat_result(st_mode=33206, st_ino=0, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=631, st_atime=1612357616, st_mtime=1612357616, st_ctime=1612353722)
pa.py os.stat_result(st_mode=33206, st_ino=0, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=0, st_atime=1614166499, st_mtime=1614166499, st_ctime=1614166499)

文件信息属性:

属性名称

说明

st_size

文件的体积大小(单位:bytes),除于1024就是KB

st_atime

文件的最近访问时间

st_mtime

文件的最近修改时间

st_ctime

windows下创建的时间

st_birthtime

在Mac、linux下使用,表示创建时间

单独查询指定文件
os.stat(指定文件路径)

import os
print(os.stat('test1.py'))

输出结果:
os.stat_result(st_mode=33206, st_ino=281474977216670, st_dev=3088097945, st_nlink=1, st_uid=0, st_gid=0, st_size=466, st_atime=1614429083, st_mtime=1614429083, st_ctime=1610954152)

UNIX时间戳

st_atime=1614166499, st_mtime=1614166499, st_ctime=1614166499
时间数字叫做UNIX时间戳
通过python转换正常时间

time模块

import time
print(time.ctime(1614166499))

输出结果:
Wed Feb 24 19:34:59 2021

datetime模块

import datetime

that_time = datetime.datetime.fromtimestamp(1614166499)
print(that_time)
print(that_time.hour,that_time.minute,that_time.second)

输出结果:
2021-02-24 19:34:59
19 34 59

综合应用

要求:

  1. 搜索这个文件夹,包括文件夹内的所有文件夹
  2. 筛选体积大于100MB的压缩包.rar文件
  3. 筛选这些文件中日期晚于2020年之后的文件
  4. 输出这些文件的路径
import os
import glob
import datetime

paths = glob.glob('**/*.rar',recursive = True)

for path in paths:
    file_size = os.stat(path).st_size/1024/1024
    file_build_year = datetime.datetime.fromtimestamp(os.stat(path).st_ctime).year
    if (file_size > 100) and (file_build_year > 2020):
        print(path)