python中文件分类_Python 文件分类

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

复制还是移动

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

准备工作

先创建两个文件夹,名字随便叫,我这里就叫 src_dir 和 des_dir 了。然后创建一些文件,代码如下: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 下。下面直接给出伪代码: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 下的实现代码如下。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 函数。这个函数有两个必选参数,第一个是源文件路径,第二个是目标文件路径。最终的源代码如下所示。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}')

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值