社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Python程序员 • 3 年前 • 412 次点击  

文章转载:Python编程

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


作为一种解释型、具有丰富的高级语言特性、跨平台又简单易用的编程语言,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 程序员深度学习的“四大名著”:



这四本书着实很不错!我们都知道现在机器学习、深度学习的资料太多了,面对海量资源,往往陷入到“无从下手”的困惑出境。而且并非所有的书籍都是优质资源,浪费大量的时间是得不偿失的。给大家推荐这几本好书并做简单介绍。


获得方式:


1.扫码关注 “高富帅程序员” 公众号
2.后台回复关键词:4books
注:此处建议复制,不然容易打错

▲长按扫描关注,回复4books即可获取
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/113977
 
412 次点击