用Python实现将不同文件按照文件后缀进行归类

本文展示了用Python实现文件按后缀分类的代码及效果,还分享了学习笔记,包括Windows系统的绝对和相对路径、os与shutil模块的使用、路径中斜线的处理等。作者因编程在各行业的广泛应用开始学Python,记录克服编程恐惧的历程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#代码及效果展示

实现代码:

在这里插入图片描述
效果:成功实现了将不同文件按照文件后缀进行归类。
分类前:
分类前
分类后:
分类后

#学习笔记

  1. Windows系统中的绝对路径和相对路径:
    绝对路径指的是文件的绝对位置,比如这个测试文件的绝对路径为“F:\ceshi”;可以在文件夹的地址栏获取。
    相对路径指的是Python文件夹所在的位置,如果你要处理的文件就在Python文件夹所在的位置,那么在编程的时候可以直接用 './'来表示路径。

  2. os 模块用于处理文件和目录;shutil模块主要用于拷贝文件。

  3. 在使用斜线(/)和反斜线(\)时要注意一下。虽然Windows在路径名中可以接受这两种斜线,但是因为当 \ 遇到r、t、n等字母时会组成各种转义字符,会带来问题。因此在文件路径中避免使用 \ 字符。
    不过要是你硬要使用 \ 倒也不是没有办法,2种办法:
    ①用\来代替\。比如写成“F:\ceshi”
    ②在字符串前面加一个r,这样可以避免转义的发生。

  4. 要特别注意这一句:
    在这里插入图片描述
    一开始没有写这一句,而第12行写成shutil.move(f,folder_name),就总是显示找不到文件。其实也很好理解,此处的f其实指的是ceshi文件夹里面的每一个文件的名字,而不是地址,因此电脑找不到这个文件。将f的文件路径f_path说清楚后问题就解决了。

#写在后面

一直都不想去学编程,一是客观原因,上学不用怎么用;但更重要的是恐惧,害怕编程。最近和朋友们在讨论以后要干什么,有朋友提到现在编程无孔不入,各行各业都会用到,再加上周围的许多人都掌握了好几门语言,所以就觉得是时候要学点东西了。一开始是看书学语法,不过担心又会因为缺乏应用而不了了之,所以转向用项目来学Python。就开始看《实用主义学Python》的课程。
今天这个程序在写的时候也是遇到一些很细节的问题,主要是第4点。后来请教了录录之后才得以解决。
感谢。
希望这个博客可以给我带来一丝丝成就感,记录我克服编程恐惧的历程吧。

<think>好的,我现在需要解决用户的问题:如何用Python根据文件名自动创建文件夹并移动文件。首先,我得理解用户的具体需求。用户希望根据文件名中的某些特征,自动创建对应的文件夹,并将文件移动到那里。比如,文件名可能包含日期、类别或其他标识符,需要根据这些信息分类存放。 接下来,我需要回忆相关的Python模块和方法。处理文件文件夹通常会用到os和shutil模块。os模块可以处理目录的创建、路径拼接等,而shutil模块则用于文件的复制或移动。用户提供的引用内容中提到了这些模块的使用,比如引用[1]和引用[2]中的例子,用到了shutil.copy和os.makedirs,这些可以作为参考。 然后,我需要设计一个步骤。首先,遍历原始文件夹中的所有文件。对于每个文件,解析文件名中的关键字,比如假设文件名是“类别_编号.txt”,那么可能需要根据“类别”来创建文件夹。接着,检查目标文件夹是否存在,如果不存在则用os.makedirs创建。然后,使用shutil.move将文件移动到对应的文件夹中。同时,可能需要记录文件移动的情况,如引用[1]中提到的生成映射文件。 不过,用户提到的是根据文件名自动创建文件夹,可能不需要复制而是移动,所以应该用shutil.move而不是copy。另外,需要考虑文件名的解析方式,比如分割文件名中的特定字符,或者使用正则表达式提取关键字。例如,文件名如果是“报告_2023_财务.pdf”,可能需要提取“财务”作为文件夹名。 在代码示例方面,需要先导入必要的模块,然后设置原始文件夹路径。遍历文件时,对于每个文件名,提取分类关键字。比如,可以通过split('_')来分割,取其中的某一部分。然后创建对应的文件夹路径,检查是否存在,不存在则创建。最后移动文件。 同时,用户提供的引用[3]提到了根据日期分类文件,这可能需要获取文件的修改日期,但用户的问题是根据文件名,所以可能需要不同的处理方式。不过这个例子中的os.path.getmtime可能暂时不需要。 另外,异常处理也很重要,比如文件名可能不符合预期的格式,或者创建文件夹时权限问题,需要try-except块来捕获异常,避免程序崩溃。例如,在os.makedirs中使用exist_ok=True参数,可以避免文件夹已存在的错误。 测试代码时,可能需要先在一个测试文件夹中运行,确保不会误操作原有文件。同时,用户可能希望保留原始文件,但根据问题描述,用户是要移动文件,所以使用shutil.move会从原位置移除文件到新位置,如果需要保留,应该用shutil.copy。 但根据用户的问题,是“移动文件”,所以使用move是正确的。不过需要提醒用户注意这一点,避免数据丢失。或者,在代码中添加注释说明这一点,让用户自行决定是否先备份。 现在,我需要将这些步骤整理成一个清晰的代码示例。例如,假设文件名结构为“category_filename.ext”,用下划线分割,第一部分是类别,那么代码可以分割文件名,取第一个部分作为文件夹名。然后创建该文件夹,移动文件进去。 同时,参考用户提供的引用[1]中的代码,使用os.makedirs(target_dir, exist_ok=True)来创建文件夹,这样可以避免重复创建时的错误。然后使用shutil.move来移动文件。 最后,可能需要生成一个日志文件,记录哪些文件被移动到了哪里,如引用[1]中的image_mapping.txt。这样用户以后可以追溯文件的移动情况。 总结步骤: 1. 设置原始文件夹路径和目标根文件夹。 2. 遍历原始文件夹中的所有文件。 3. 对每个文件名,解析出分类关键字(如分割字符串)。 4. 根据关键字创建目标文件夹路径。 5. 创建目标文件夹(如果不存在)。 6. 移动文件到目标文件夹。 7. 可选:记录移动日志。 现在,将这些步骤转化为代码,并添加必要的注释,确保用户能够理解每个部分的作用。同时,处理可能的异常情况,比如文件名中没有分隔符的情况,可以跳过或归类到默认文件夹。 例如,代码可能如下: import os import shutil source_folder = './原始文件/' target_root = './分类后/' for filename in os.listdir(source_folder): # 跳过子目录,只处理文件 if os.path.isfile(os.path.join(source_folder, filename)): # 分割文件名,假设用下划线分隔,第一部分为类别 parts = filename.split('_') if len(parts) < 2: # 处理不符合格式的文件,如移动到其他文件夹 category = '其他' else: category = parts[0] # 创建目标文件夹路径 target_dir = os.path.join(target_root, category) os.makedirs(target_dir, exist_ok=True) # 移动文件 source_path = os.path.join(source_folder, filename) target_path = os.path.join(target_dir, filename) shutil.move(source_path, target_path) print(f'已移动 {filename} 到 {target_dir}') 然后,需要提醒用户根据实际文件名结构修改分割方式,比如使用正则表达式提取日期或其他模式。例如,如果文件名包含日期格式如“20230415_report.txt”,可以用正则表达式r'\d{8}'来提取日期,然后按年月日创建文件夹。 此外,用户可能需要不同分类方式,比如根据文件扩展名分类,这时候需要修改提取category的部分为文件的后缀,如ext = filename.split('.')[-1],然后创建对应的文件夹。 在回答中,应该提供示例代码,并解释关键步骤,同时提到可能的变体和注意事项,比如文件名解析的方法、异常处理、移动与复制的区别等。同时,根据用户提供的引用,引用[1]和引用[2]中的相关代码可以作为参考,特别是使用os.makedirs和shutil的部分。 最后,生成相关问题,比如如何根据扩展名分类、如何处理文件名不符合格式的情况、如何记录移动日志等,帮助用户进一步探索。</think>根据文件名特征自动分类文件Python实现步骤如下: ### 操作步骤 1. **导入必要模块** ```python import os import shutil ``` 2. **设置路径参数** ```python source_dir = "./原始文件/" # 原始文件存放路径 target_root = "./分类结果/" # 分类结果根目录 log_file = "./文件分类日志.txt" # 操作日志记录 ``` 3. **编写分类逻辑** ```python with open(log_file, "w") as log: for filename in os.listdir(source_dir): file_path = os.path.join(source_dir, filename) # 只处理文件(跳过子目录) if os.path.isfile(file_path): # 提取分类特征(示例:按前缀分类) category = filename.split('_')[0] # 假设文件名格式为"类别_文件名" # 创建目标目录 target_dir = os.path.join(target_root, category) os.makedirs(target_dir, exist_ok=True) # 自动创建目录[^1] # 移动文件并记录日志 try: shutil.move(file_path, target_dir) log.write(f"{filename} -> {target_dir}\n") except Exception as e: log.write(f"错误:{filename} - {str(e)}\n") ``` ### 功能扩展说明 1. **多级分类**:支持`filename.split('_')[0:2]`实现二级分类 2. **正则匹配**:使用正则表达式提取日期等复杂特征 ```python import re # 提取日期格式(示例文件名:20230415_report.pdf) match = re.search(r'(\d{4})(\d{2})(\d{2})', filename) if match: year, month, day = match.groups() category = f"{year}/{year}-{month}" # 创建年/年月目录结构 ``` 3. **保留目录结构**:使用`shutil.copytree`替代`shutil.move`可保留原始结构[^2] ### 注意事项 1. 建议先测试`shutil.copy`代替`move`验证分类效果 2. 使用`os.path.splitext`可分离文件扩展名进行分类 3. 异常处理应包含权限错误、无效文件名等情况
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hardworking_IC_boy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值