使用Python程序清除下载文件夹

引言


作为一个刚开始学习Python的人,我尝试通过直接练习来获得新的知识和技能。 我认为,这种方法比制定编程指南和多卷本更好。 首先,在我将要讨论的项目中,我试图满足我的需求。 其次是希望其他人可以派上用场( 在解决所有现有错误之后

该程序的想法是在我试图在“下载”文件夹中形成的“垃圾”中查找先前下载的文件时出现的。 带有音乐的图像,文档,档案和视频:您当然可以理解这种混乱并过滤文件,但是由于时间长,您不愿意。 而且我认为,有一个程序可以解析“下载”文件夹并将文件分发到“图像”,“文档”,“视频”和“音乐”系统的标准文件夹中,并删除不必要的文件,这很好。 结果,完美主义者组织者诞生了,我想谈一谈。 我必须马上说这是一篇从初学者到初学者的文章,因为经验丰富的Python程序员在这里不会发现任何有用的东西( 除了能够深入研究代码并指出很多错误的能力 )。

总体思路


程序应该做的第一件事是确定程序在哪个操作系统上运行。 这是必须的,因为在Linux和Windows上,“下载”文件夹的位置不同(我没有考虑在此操作系统上使用Mac的能力,因此无法在Mac上测试该程序)。 在检测到的下载文件夹中,程序将浏览所有可用文件,并确定它们属于哪种类型(音乐,视频,文档等)。 之后,将检测到的文件移动到默认文件夹,程序从用户那里找出如何处理那些不适合移动的文件-离开或删除。

导入所需的库并确定系统类型


要使用操作系统及其中的文件,我们需要os库。 getpass库将让您知道系统上的用户名, 平台将确定它是Windows还是Linux。 我们从一开始就通过导入连接所有必需的库,然后确定操作系统类型和用户名。

import os import getpass import platform type_os = platform.system() usermane = getpass.getuser() 

创建带有流行文件扩展名和与之关联的默认文件夹的字典


使用标准的Python工具,我们创建了四种字典,它们具有最受欢迎的文件类型:音乐,图像,视频和文档。

 video_folder = {".3gp" : "/", ".avi" : "/", ".flv" : "/", ".m4v" : "/", ".mkv" : "/", ".mov" : "/", ".mp4" : "/", ".wmv" : "/", ".webm" : "/"} music_folder = {".mp3" : "/", ".aac": "/", ".flac" : "/", ".mpc" : "/", ".wma" : "/", ".wav" : "/"} pic_folder = {".raw" : "/", ".jpg" : "/", ".tiff" : "/", ".psd" : "/", ".bmp" : "/", ".gif" : "/", ".png" : "/", ".jp2" : "/", ".jpeg" : "/"} doc_folder = {".doc" : "/", ".docx" : "/", ".txt" : "/", ".rtf" : "/", ".pdf" : "/", ".fb2" : "/", ".djvu" : "/", ".xls" : "/", ".xlsx" : "/", ".ppt" : "/", ".pptx" : "/", ".mdb" : "/", ".accdb" : "/", ".rar" : "/", ".zip" : "/", ".7z" : "/"} 

不要忘记在文件夹名称之后文件名仍然存在,因为最后我有/。 通过编辑字典,可以轻松添加新文件类型。

我们要求用户提供下载文件夹的名称


在Windows和Linux上,下载文件夹以不同的名称出现在系统上。 对于Windows,这与Downloads文件夹的本地化无关,然后在Linux发行版中,此文件夹称为“ Downloads”。 此外,用户可能会更改带有已下载文件的文件夹的名称,并且您需要询问目录的当前名称是否与标准名称不同。

 if type_os == "Linux": user_downloads_path = input("      ? (-: ) ") or "" if type_os == "Windows": user_downloads_path = input("      ? (-: ) ") or "Downloads" 

构造可让您在input中使用默认值。 也就是说,如果用户没有更改下载文件夹的名称,则无需执行任何操作,程序本身将在其他代码中替换必要的值。

设置下载文件夹的路径


根据操作系统的不同,下载文件夹可能位于不同的位置。 对于Linux,此文件夹位于路径/ home / username / Downloads /上 ,在Windows中,路径为C:/ Users / username / Downloads / 。 为了以后不再手动指定这些路径,创建在其中指定这些路径的变量会更容易。

 if type_os == "Linux": default_path_d = "/home/" + usermane + "/" + user_downloads_path + "/" else: default_path_d_win = r"C:/Users/" + usermane + r"/" + user_downloads_path+ r"/" 

为特定用户设置下载文件夹的路径


为了进一步使用先前连接的模块的功能来处理操作系统和文件,我们必须使用我们先前创建和接收的变量来设置下载文件夹的路径。

 if type_os == "Linux": downloads_path = os.listdir("/home/" + usermane + "/" + user_downloads_path) else: downloads_path_win = os.listdir(r"C:/Users/" + usermane + r"/" + user_downloads_path) 

好了,为了方便进一步使用代码,我们设置了表单/主文件夹/用户名的路径

 if type_os == "Linux": default_path_u = "/home/" + usermane + "/" else: default_path_u_win = r"C:/Users/" + usermane + r"/" 

检查下载文件夹中的特定文件


通过枚举字典,我们将其键与下载文件夹中的文件扩展名进行比较。 如果扩展名与密钥匹配,则必须将必要的文件移动到相应的默认文件夹(其名称是词典中的值)。

 #      .  ,      for music_format in music_folder: if type_os == "Linux": for name_file in downloads_path: if name_file.endswith(music_format): result = name_file.split(str(music_format), 1) os.rename(default_path_d + result[0] + music_format, default_path_u + music_folder.get(music_format) + result[0] + music_format) if type_os == "Windows": for name_file in downloads_path_win: if name_file.endswith(music_format): result = name_file.split(str(music_format), 1) os.rename(default_path_d_win + result[0] + music_format, default_path_u_win + "Music" + r"/" + result[0] + music_format) #      .  ,      for pic_format in pic_folder: if type_os == "Linux": for name_file in downloads_path: if name_file.endswith(pic_format): result = name_file.split(str(pic_format), 1) os.rename(default_path_d + result[0] + pic_format, default_path_u + pic_folder.get(pic_format) + result[0] + pic_format) if type_os == "Windows": for name_file in downloads_path_win: if name_file.endswith(pic_format): result = name_file.split(str(pic_format), 1) os.rename(default_path_d_win + result[0] + pic_format, default_path_u_win + "Pictures" + r"/" + result[0] + pic_format) #        .  ,      for doc_format in doc_folder: if type_os == "Linux": for name_file in downloads_path: if name_file.endswith(doc_format): result = name_file.split(str(doc_format), 1) os.rename(default_path_d + result[0] + doc_format, default_path_u + doc_folder.get(doc_format) + result[0] + doc_format) if type_os == "Windows": for name_file in downloads_path_win: if name_file.endswith(doc_format): result = name_file.split(str(doc_format), 1) os.rename(default_path_d_win + result[0] + doc_format, default_path_u_win + "Documents" + r"/" + result[0] + doc_format) 

最初,我计划解决使用正则表达式查找文件扩展名的问题,并参与了其制定工作。 但是随后,我在其中一个站点上读到,如果您想解决问题,则只需要使用正则表达式就可以了。 Python还有其他更简单,更直观的方式来满足您的需求。 因此,可以使用字符串方法endswith()来确定文件扩展名,而不是使用这些表达式。 它从字典中获取密钥,并检查文件是否以此结尾。 然后,使用split()方法,仅使用os.rename()获取文件名以进行进一步移动。 作为后者的参数,将使用所有先前创建的变量。

我们询问用户如何处理其余文件。


在对必要的文件进行排序之后,程序应结束或删除那些不属于移动范围的文件(例如,exe文件或deb-packages)。 该决定由用户决定;默认情况下,不会发生删除。

 #        delete_user_confirm = input('     ?     (-: ) ' or '') if delete_user_confirm == '': if type_os == "Linux": files_to_remove = os.listdir(default_path_d) for remove_files in files_to_remove: os.remove(default_path_d + "/" + remove_files) if type_os == "Windows": files_to_remove = os.listdir(default_path_d_win) for remove_files in files_to_remove: os.remove(default_path_d_win + "/" + remove_files) else: print('  .   .') 

总结一下


我试图解释我创建的程序如何尽可能清晰地工作。 但是我认为那些想了解的人仍然会多次审查代码本身。 Perfectionist Organizer有两个版本-控制台和图形版本。 您可以在指向我的Github的链接上找到它们,并提供有关如何下载和使用该程序的说明。 我在主操作系统(Archlinux)上运行了控制台版本,在Windows 7的虚拟机中运行了GUI版本。在两种情况下,该程序都能正常运行。 我还想附上一个演示如何在Linux下工作的演示。 如果您对这个主题感兴趣,那么在下一篇文章中,我将告诉您如何制作GUI版本以及遇到的困难。

完美主义者组织者的示范
图片

未来计划


接下来的程序是一个程序,它将提醒您Telegram中Google表格中的重要事件。 完成后,我会在这里告诉您。 您可以在评论或PM中保留有关Perfectionist组织者工作的任何问题和反馈。 感谢您的关注!

Source: https://habr.com/ru/post/zh-CN468311/


All Articles