前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 文件分类

Python 文件分类

作者头像
不可言诉的深渊
发布2019-07-26 17:36:23
1.1K0
发布2019-07-26 17:36:23
举报

文件分类应该是大家每天都在做的事情。假设现在有一大批文件(这一大批文件类型不定,也就是说有些是文本文件有些是二进制文件)都被放在了一个文件夹中,需要对它们进行一个分类,该如何迅速地完成?手工操作文件数量少还可以接受,文件数量一旦多了起来就显得力不从心~!因此,编写一个程序来处理这个问题是很有必要的。下面我用最简单的例子为大家讲解如何快速完成文件分类的操作。

复制还是移动

文件分类就是把一个文件夹中的文件进行一个分类,每一个类对应一个文件夹。既然如此,我们就需要把当前文件复制或移动到对应类别的文件夹中,这里究竟是选择复制还是移动呢?我的选择是复制,因为复制会将原来的保留,即使程序出错也不用还原操作。

准备工作

先创建两个文件夹,名字随便叫,我这里就叫 src_dir 和 des_dir 了。然后创建一些文件,代码如下:

代码语言:javascript
复制
from random import choice
file_names_without_extension = ['a', 'b', 'c']
extensions = ['a', 'b', 'c']
file_names_with_extension = (f'{file_name_without_extension}.{extension}'for file_name_without_extension in
                             file_names_without_extension for extension in extensions)
choices = ['w', 'wb']
for file_name_with_extension in file_names_with_extension:
    open(f'src_dir/{file_name_with_extension}', choice(choices))

运行完成之后会发现 src_dir 目录下多了 9 个文件,如图所示。

如何分类

我这里就简单地按照不带扩展名的文件名分类,把相同的放在一个目录中,这个目录的名字就是不带扩展名的文件名,目录创建在 des_dir 下。下面直接给出伪代码:

代码语言:javascript
复制
from os import listdir, mkdir
from os.path import exists
file_names_with_extension = listdir('src_dir')
for file_name_with_extension in file_names_with_extension:
    file_name_without_extension = file_name_with_extension.rsplit('.', 1)[0]
    dir0 = f'des_dir/{file_name_without_extension}'
    if not exists(dir0):
        mkdir(dir0)
    copy(f'src_dir/{file_name_with_extension}', f'{dir0}/{file_name_with_extension}')

现在的关键在于 copy 函数的实现,下面将会重点讲解。

先读取后写入

一般人可能都会想到先把文件内容读取到内存,然后再写入到新文件,按照这个思路走下去绝对没问题。只不过我刚说了,文件类型不确定,不能简单地一律用 r 或者 rb,要看情况的,为此,判断文件类型成了最重要的一环。虽然 Python 有模块专门识别文件类型,模块就是——filetype 和 mimetypes,但是它对于不常见的扩展名(比如 .b 文件)就显得力不从心,因此,我们直接抛弃这种先读取后写入的方法。

系统调用

接下来我换了一种简单的方法,通过程序执行操作系统命令来完成复制文件,Windows 下的实现代码如下。

代码语言:javascript
复制
from os import listdir, mkdir, system
from os.path import exists


def copy(src, des):
    system(f'copy "{src}" "{des}"')


file_names_with_extension = listdir('src_dir')
for file_name_with_extension in file_names_with_extension:
    file_name_without_extension = file_name_with_extension.rsplit('.', 1)[0]
    dir0 = f'des_dir\\{file_name_without_extension}'
    if not exists(dir0):
        mkdir(dir0)
    print(f'src_dir\\{file_name_with_extension}')
    copy(f'src_dir\\{file_name_with_extension}', f'{dir0}')

确实很简单,但是跨平台的能力太弱了,难道就没有通用的不受操作系统限制的办法吗?

shutil.copy

实际上,Python 对于文件复制操作已经有模块封装好了,直接调用即可——它就是模块 shutil 中的 copy 函数。这个函数有两个必选参数,第一个是源文件路径,第二个是目标文件路径。最终的源代码如下所示。

代码语言:javascript
复制
from os import listdir, mkdir
from os.path import exists
from shutil import copy


file_names_with_extension = listdir('src_dir')
for file_name_with_extension in file_names_with_extension:
    file_name_without_extension = file_name_with_extension.rsplit('.', 1)[0]
    dir0 = f'des_dir/{file_name_without_extension}'
    if not exists(dir0):
        mkdir(dir0)
    print(f'src_dir/{file_name_with_extension}')
    copy(f'src_dir/{file_name_with_extension}', f'{dir0}')

其实在真正的文件分类中,分类规则可能比我这个复杂得多,甚至可能会出现一些错误。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-04-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python机器学习算法说书人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档