用Python,3天实现文件系统自动“瘦身”!

马哥Linux运维

共 5159字,需浏览 11分钟

 ·

2021-05-02 10:10

许多人花上数小时点击鼠标和敲打键盘,执行重复的任务,却没有意识到,如果他们给机器正确的指令,机器就能在几秒钟内完成他们的工作。 

作为一种解释型、具有丰富的高级语言特性、跨平台又简单易用的编程语言,Python能帮我们做的,远不止是在工作中完成正式项目的任务,更能帮我们解决日常生活中一些琐碎的“小事”——让繁琐工作自动化,不但大大节省精力和时间,还能呈数量级地提高工作效率,谈笑间,让琐事“灰飞烟灭”。
自动化的双层含义
提起自动化,往往包含两层含义,其中一层,是通过编写代码,自动完成解决问题需要的整个或部分流程,把多个步骤“封装”或“固化”成一段代码,一次运行,节省多道手工手续,省力;另外一层,则是通过定期或不定期代码的重复执行,节省不必要的重复、琐碎、或常规化操作,所谓“一次编写,处处运行”,省心。
两个层面结合,就能事半功倍、省心省力、准确高效地解决各种日常任务。而这,也恰恰是编程思维非常重要的一个方面。

我们日常工作中面对的很多事儿,。就拿我们日常文件系统维护这件小事来说,手动批量重命名文件、定期备份、文件自动分组这些小事,手动完成太繁琐,自己花点时间写个小程序,轻松就能搞定,不仅省时省力,还有背后那份喜悦和成就感,是难以言表的。
有人提问:用 python 进行办公自动化都需要学习什么知识呢?这可能是很多非 IT 职场人士面临的困惑,想把 python 用到工作中,却不知如何下手?python 在自动化办公领域越来越受欢迎,批量处理简直是加班族的福音。
自动化办公无非是 excel、ppt、word、邮件、文件处理、数据分析处理、爬虫这些,接下来,我们通过具体例子,看看Python是如何帮文件系统“瘦身”的。

一、瘦身计划——自动删除久未访问的文件

你是不是也有这样一个叫“download”或“temp”的文件夹,里面多是从网上下载的各类文件,还有别人发给你的文档,时间一长,里面的文件就是一堆,看着心烦。其中有些文件可能挺重要,隔三差五能用到,而有些可能永远都不会再用到,而且用不到的往往是大多数。最简单的“瘦身”方案,就是删除那些没必要保留的文件,怎么判断呢?在文件系统里,每个文件都会保存最后访问时间的信息,记录着你最后一次用到这个文件的具体时间,根据这个时间,我们很容易判断一个文件是不是已经被“打入冷宫”、可以放心清除了。这事儿手动完成很容易,但文件一多,你肯定会觉得无聊,尤其是文件成百上千的时候,绝对让人抓狂。这时候,就可以用Python代码实现自动化来帮忙了。python 在处理批量操作有得天独厚的优势,成千上万的文件修改可能只需几秒的时间。
把问题分解一下,要做的基本上就是三件事:遍历文件夹下所有文件、筛选出最后访问日期早于某个时间点的文件、删除筛出的老文件。先在命令行打开Python交互界面:
$ Python
文件遍历、最近访问日期的获取和文件删除操作,都要用到Python的“os”模块,获取当前时间要用到“time”模块。所以先加载“time”和“os”这两个模块:
>>> import time>>> import os
用time.time()获取现在时间,计算可以接受的最老的文件被访问时间old_threshold,这里定为30天之前:
>>> time_now = time.time()>>> time_threshold = time_now - 30 * 24 * 60 * 60
接下来,确定要清理的目录,通过os.listdir()获取该目录下所有文件、子目录的列表,保存到files:
>>> path = "/Users/guest/Downloads">>> files = os.listdir(path)
接下来,遍历files,用os.path.join()得到当前遍历项的绝对路径,用os.path.isdir()检查每一项是文件还是目录:如果是目录,则直接忽略,如果是文件,则用os.stat()检查它上次被访问的时间——如果最后访问时间在过去30天内,则直接忽略,超出的用os.remove()删除文件:
>>> for file_name in files:...     file_pathname = os.path.join(path, file_name)...     if not os.path.isdir(file_pathname):...         access_time = os.stat(file_pathname).st_atime...         if access_time < old_threshold:...             os.remove(file_name)...             print('Removed: ' + file_name)
无论何时运行以上代码,都会方便地检查目录、删除过期文件。
注意:用os.remove()删除的文件,不会进入回收站,因此务必小心,调试时可先把os.remove(file_name)注释掉,并及时备份,防止意外删除造成损失。

二、一目了然—将文件按类型组织到对应子目录下

老文件清除了,要是文件依然很多,该怎么办呢?一种简单的策略,就是“分而治之”, 具体的功能很简单,给定一个打算整理的文件夹目录,这个脚本可以将该目录下的所有文件都揪出来,并且根据后缀名归类到不同的文件夹里,这简直是整理爱好者的福音。把不同类型的文件移到专门的文件夹里,比如把扩展名为“.mp4”和“.mkv”的文件移动到“movie”子目录,把扩展名为“.png”、“.jpg”的文件移动到“image”子目录,等等,以后再找文件就能快速定位了,目录看起来也清爽许多。

首先,还是把问题分解一下,要做的也是三件事:遍历文件夹下所有文件、根据文件扩展名判断文件类型、根据文件类型将文件移动到对应子目录(子目录不存在则需要创建子目录)。先在命令行打开Python交互界面:

$ Python

文件遍历和路径操作仍要用到“os”模块,文件移动操作要用到“shutil”模块,先加载这两个模块:

>>> import os>>> import shutil

设定要清理的目录,通过os.listdir()获取该目录下所有项目,保存到files:

>>> path = "/Users/guest/Download">>> files = os.listdir(path)

遍历files,用os.path.isdir()检查每一项是文件还是目录:如果是目录,则直接忽略,如果是文件,则用.endswith()检查文件名后缀,据此判断文件类别img_class,如果类别检出成功,则用shutil.move()将该文件移动到类别对应的子目录下,如果该子目录不存在则用os.makedirs()创建目录:

>>> for file_name in files:...    file_pathname = os.path.join(path, file_name)...    img_class = ''...    if not os.path.isdir(file_pathname):...   if file_name.endswith('.jpg') or file_name.endswith('.png'):...   img_class = 'image'...   elif file_name.endswith('.mp4') or file_name.endswith('.mkv'):...   img_class = 'movie'...   if img_class:...   target_path = os.path.join(path, img_class)...   if not os.path.isdir(target_path):...   os.makedirs(target_path)...   shutil.move(file_pathname, os.path.join(target_path, file_name))

运行完成,会看到各类文件已经被移动到对应子目录下。这里如果不对子目录是否存在进行判断就贸然移动文件,可能会触发目录不存在的异常。

三、解放双手——Python程序的自动调度

通过以上两段代码,我们已经实现了自动化的系统简单清理,虽然每次运行没问题,但还是需要我们手动执行——能不能一劳永逸,彻底不用管它实现完全自动化呢?答案是肯定的。最简单的方案,就是用crontab安排Python脚本在特定时间周期性执行。crontab是老牌的定时任务管理工具,会按照设定的周期、指定的时间执行特定应用。为了使用crontab,首先需要将之前的Python代码整合成一个Python脚本文件,取名为system_cleaner.py:
import timeimport osimport shutiltime_now= time.time()
old_threshold = time_now - 30 * 24 * 60 * 60path = "/Users/guest/Download"
files = os.listdir(path)for file_name in files:file_pathname = os.path.join(path, file_name)img_class = ''if not os.path.isdir(file_pathname):access_time = os.stat(file_pathname).st_atimeif access_time < old_threshold:os.remove(file_name)print(file_name + ' removed')else:if file_name.endswith('.jpg') or file_name.endswith('.png'):img_class = 'image'elif file_name.endswith('.mp4') or file_name.endswith('.mkv'): img_class = 'movie'if img_class: target_path = os.path.join(path, img_class) if not os.path.isdir(target_path): os.makedirs(target_path) shutil.move(file_pathname, os.path.join(target_path, file_name
在终端中键入以下命令,在编辑模式打开crontab:
$ crontab -e
在文件底部键入这行内容:
0 0 * * 0 python system_cleaner.py
这行内容设定了要求crontab如何自动执行我们的脚本。其中第一项是几分,范围是0-59;第二项是几点,范围是0-23;第三项是几号,范围是1-31;第四项是几月,范围是1-12;第五项是星期几,范围是0-6,0表示星期天。这里的“*”是通配符,表示任意值都可以。所以,这一行最前面的“0 0 * * 0”表示我们希望在每周日00:00调度运行名为system_cleaner.py的Python脚本,怎么样,很简单吧?
自动化可以帮我们节省大量精力和时间、提高工作效率,让生活变得更加轻松,这里,我们只是举了一个非常简单的文件自动清理的例子,你完全可以用相同的思路和知识来自动化其他琐碎的日常任务。具体做什么不重要,重要的是通过Python脚本让繁琐工作自动化的思路,希望能对你有所帮助,人生苦短,我用python!
文章转载:Python编程

(版权归原作者所有,侵删)


点击下方“阅读原文”查看更多

浏览 62
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报