python自动化办公(第2课)遍历、搜索文件及查询文件信息

python自动化办公(第2课)遍历、搜索文件及查询文件信息

- 使用os.walk()函数把文件夹里的文件夹里的文件夹里的文件都找出来

import os
for dirpath,dirnames,files in os.walk("D:\Apython\代码文件\自动化办公\python自动化办公第一次作业"):
    print(f"发现文件夹:{dirpath}")
    print(files)
发现文件夹:D:\Apython\代码文件\自动化办公\python自动化办公第一次作业
['python学生表.xlsx', 'python笔记.txt', 'python笔记2.doc', '新建 DOCX 文档.docx', '新建 PPTX 演示文稿.pptx', '新建 XLS 工作表.xls']
发现文件夹:D:\Apython\代码文件\自动化办公\python自动化办公第一次作业\python文件夹1
['新建 DOC 文档.doc', '新建 PPTX 演示文稿.pptx', '新建文本文档 (2).txt', '新建文本文档.txt']
发现文件夹:D:\Apython\代码文件\自动化办公\python自动化办公第一次作业\python文件夹2
[]
发现文件夹:D:\Apython\代码文件\自动化办公\python自动化办公第一次作业\文件夹1
['新建 PPT 演示文稿.ppt', '新建 RTF 文档.rtf', '新建 XLSX 工作表.xlsx', '新建文本文档.txt']
发现文件夹:D:\Apython\代码文件\自动化办公\python自动化办公第一次作业\文件夹2
[]
f 表示格式化字符串,加 f 后可以在字符串里面使用用花括号括起来的变量和表达式,功能类似于接受的格式字符串str.format()

- 使用字符串内置方法.startswith()和.endswith()来判断文件名

  • 字符串A.startswith(字符串B):字符串A是否以字符串B开头
  • 字符串A.endswith(字符串B):字符串A是否以字符串B结尾
print("abc.txt".startswith("ab"))
print("abc.txt".endswith(".txt"))
True
True

- 使用glob模块来匹配搜索文件

import glob
print(glob.glob("**/*.txt",recursive=True))
['123.txt', '第一层文件夹\\第二层文本文件.txt', '第一层文件夹\\第二层文件夹\\第三层文本文件.txt']
  • recursive=True会不断进入文件夹【递归方法】

  • 用 【**/*.后缀名 + recursive=True】 的方法来遍历所有文件夹

  • 文件搜索匹配
    python自动化办公(第2课)遍历、搜索文件及查询文件信息_第1张图片

print(glob.glob("[1-5]?*.txt"))
['123文本.txt', '234文本.txt', '345文本.txt', '456文本.txt']
print(glob.glob("[1-5]?*.txt"))
['123文本.txt', '234文本.txt', '345文本.txt', '456文本.txt', '567文本.txt']

python自动化办公(第2课)遍历、搜索文件及查询文件信息_第2张图片

- 用fnmatch模块匹配文件名

  • fnmatch.fnmatch(“文件名”,“匹配条件”)

  • 指判断我们找到的这个文件名是否符合我们后面设定的匹配条件

import fnmatch
print(fnmatch.fnmatch("lessin1.py","le*1.py"))
print(fnmatch.fnmatch("lessin5.py","le*[1-4].py"))
print(fnmatch.fnmatch("lessin5.py","le*[1-6].py"))
True
False
True

- 用file.stat()函数来查看文件具体信息,如什么时候创建的,什么时候修改的,文件大小等

for file in os.scandir():
    print(file.name,file.stat())
.ipynb_checkpoints os.stat_result(st_mode=16895, st_ino=0, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=0, st_atime=1594523818, st_mtime=1594523818, st_ctime=1594436131)
123文本.txt os.stat_result(st_mode=33206, st_ino=0, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=14, st_atime=1594523064, st_mtime=1594523064, st_ctime=1594519859)
234文本.txt os.stat_result(st_mode=33206, st_ino=0, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=17598, st_atime=1594523112, st_mtime=1594523112, st_ctime=1594522053)
345文本.txt os.stat_result(st_mode=33206, st_ino=0, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=3518, st_atime=1594523119, st_mtime=1594523119, st_ctime=1594522053)
456文本.txt 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=1594522074, st_mtime=1594522074, st_ctime=1594522053)
567文本.txt 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=1594522196, st_mtime=1594522196, st_ctime=1594522196)
Python自动化办公(第1课)输出目录下所有文件及文件夹.ipynb os.stat_result(st_mode=33206, st_ino=0, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=103706, st_atime=1594523818, st_mtime=1594523818, st_ctime=1594436131)
python自动化办公(第2课)遍历、搜索文件及查询文件信息.ipynb os.stat_result(st_mode=33206, st_ino=0, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=133340, st_atime=1594524593, st_mtime=1594524593, st_ctime=1594475681)
第一层文件夹 os.stat_result(st_mode=16895, st_ino=0, st_dev=0, st_nlink=0, st_uid=0, st_gid=0, st_size=0, st_atime=1594519979, st_mtime=1594519950, st_ctime=1594519865)

stat主要参数有以下:

  • st_size:文件的体积大小(单位:bytes)除以1024就是kb
  • st_atime:文件的最近访问时间【access缩写】使用的是unix时间戳
  • st_mtime:文件的最近修改时间【modify缩写】使用的是unix时间戳
  • st_ctime:windows下表示创建时间【create缩写】使用的是unix时间戳
  • st_birthtime:只有在mac和linux下可用,表示创建时间

使用time模块的time.ctime()函数来翻译unix时间戳

  • time.ctime()

情况一: 将时间戳转换成普通时间的方法如下

  • 先用time.gmtime()函数返回普通时间数组
  • 再用time.strftime()函数将时间数组格式化为所需要的格式
import time
time_unix = 1332888820
time_normal = time.gmtime(time_unix)
dt = time.strftime("%Y-%m-%d %H:%M:%S",time_normal)
print(f"时间戳转化为普通时间为:{dt}")
时间戳转化为普通时间为:2012-03-27 22:53:40

情况二: 将普通时间转换成时间戳的方法如下

  • 先用time.strptime()函数将普通时间转换成时间数组
  • 再用time.mktime()函数将时间数组转化成时间戳
dt="2012-03-27 22:53:40"
time_list=time.strptime(dt,"%Y-%m-%d %H:%M:%S")
time_unix=int(time.mktime(time_list))
print(time_unix)
1332860020

总结:【注意%后面字母的大小写】

  • time.gmtime()函数将时间戳转换成普通时间数组
  • time.strptime(dt,"%Y-%m-%d %H:%M:%S")函数将普通时间转换成时间数组
  • time.strftime("%Y-%m-%d %H:%M:%S",time_normal)函数将时间数组格式化为所需要的格式
  • time.mktime()函数将时间数组转换成时间戳
import time
import os
for file in os.scandir():
    if ".txt" in file.name:
        print(file.name,time.ctime(file.stat().st_mtime))
123文本.txt Sun Jul 12 11:04:24 2020
234文本.txt Sun Jul 12 11:05:12 2020
345文本.txt Sun Jul 12 11:05:19 2020
456文本.txt Sun Jul 12 10:47:54 2020
567文本.txt Sun Jul 12 10:49:56 2020

使用datetime模块转换时间戳更好看

用datetime计算时间差

  • datetime.datetime.fromtimestamp()
import datetime
d1=datetime.datetime(2020,7,20)
d2=datetime.datetime(2020,7,10)
difference_time=(d1-d2).days
print(difference_time)
10

只能获得时间戳时可用以下方法计算时间差

import time
import datetime

compare_time = "2020,07,20"
compare_time_list = time.strptime(compare_time, "%Y,%m,%d")
compare_unix_time = time.mktime(compare_time_list)
# 上面我随便写一个普通时间,因为我不知道怎么写时间戳

time_list = time.gmtime(compare_unix_time)  # 当只能返回一个unix时间戳时可将compare_unix_time替换
commonTime = time.strftime("%Y,%m,%d", time_list)
d1 = datetime.datetime(2020, 7, 15)
# 用字符串分割的方法将月份或日期中的0分离
year = commonTime[0:4]
if commonTime[5] == 0:
    month = commonTime[6]
else:
    month = commonTime[5:7]
if commonTime[8] == 0:
    day = commonTime[9]
else:
    day = commonTime[8:10]

d2 = datetime.datetime(int(year), int(month), int(day))
difference = (d2-d1).days + 1   # 未知原因:普通时间转时间戳再转普通时间会有一天的时间差
print(f"时间差为:{difference}天")
时间差为:5天
  • datetime.datetime.fromtimestamp()用转换时间戳更好看一些
import datetime
import os
for file in os.scandir():
    if ".txt" in file.name:
        print(file.name,datetime.datetime.fromtimestamp(file.stat().st_mtime))
123文本.txt 2020-07-12 11:04:24.643349
234文本.txt 2020-07-12 11:05:12.179337
345文本.txt 2020-07-12 11:05:19.653509
456文本.txt 2020-07-12 10:47:54.647869
567文本.txt 2020-07-12 10:49:56.998667

如果想单独查看文件具体信息,可直接使用 os.stat() 函数

print(os.stat("123文本.txt"))
print("——————分割线——————")
print(os.stat("123文本.txt").st_size)
print(datetime.datetime.fromtimestamp(os.stat("123文本.txt").st_atime))
print(time.ctime(os.stat("123文本.txt").st_mtime))
print(os.stat("123文本.txt").st_ctime)
os.stat_result(st_mode=33206, st_ino=5348024557544664, st_dev=2089448231, st_nlink=1, st_uid=0, st_gid=0, st_size=14, st_atime=1594523065, st_mtime=1594523064, st_ctime=1594519859)
——————分割线——————
14
2020-07-12 11:04:25.856858
Sun Jul 12 11:04:24 2020
1594519859.7518227

作业:编写python程序,要求如下

  • 搜索整个文件夹,包括文件夹内的文件夹
  • 筛选体积大于10MB的压缩包.zip文件
  • 筛选这些文件中日期早于某时间(自定义)之前的文件
  • 输出这些文件的路径
import os
import time

# 见第2课笔记中unix时间戳与普通时间转换
# 为下面比较时间大小做准备
compare_time="2020-07-12 12:31:59"
compare_time_list=time.strptime(compare_time, "%Y-%m-%d %H:%M:%S")
compare_time_nuix= int(time.mktime(compare_time_list))

for dirpath,dirname,files in os.walk("D:\Apython\代码文件\自动化办公\python自动化办公第2次作业"):
    for file in os.scandir(dirpath):
        if (file.name).endswith(".zip") or (file.name).endswith(".rar"):
            # print(file.name,file.stat().st_size)
            if file.stat().st_size/ 1024/ 1024 >10:
                # print(file.name,file.stat().st_size/ 1024/ 1024)
                # print(file.name,file.stat().st_ctime)

                # 获得file的整形unix时间戳
                file_int_unix_time=int(file.stat().st_ctime)
                if file_int_unix_time < compare_time_nuix:
                    print(file.path)
D:\Apython\代码文件\自动化办公\python自动化办公第2次作业\二级C无纸化考试模拟软件.zip
D:\Apython\代码文件\自动化办公\python自动化办公第2次作业\压缩包\数据结构课件.zip
D:\Apython\代码文件\自动化办公\python自动化办公第2次作业\压缩包\李明特2019年度总结.zip

python自动化办公(第2课)遍历、搜索文件及查询文件信息_第3张图片

注:关键在于使用两个for循环,第一个for循环遍历所有文件夹下的文件,第二个for循环通过os.scandir()函数返回上一层循环所进入的文件夹中的文件的DirEntry(有点拗口)然后就可以为所欲为啦~

你可能感兴趣的:(python自动化办公,python)