Python结合os模块和shutil模块实现本地文件自动化操作

季宁
季宁
发布时间:2026-10-12 | 1人浏览过
原创

本文详细讲解如何利用Python的os和shutil模块进行本地文件的自动化管理。内容涵盖路径拼接与导航、文件与文件夹的复制(含元数据保留)、移动剪切、删除(包括非空文件夹处理)、新建以及隐藏文件的识别与过滤。通过具体代码示例和三个实战案例(文件分类、清理空文件夹、备份),帮助开发者掌握文件系统操作的核心技能,提升自动化工作效率。

在Python中,处理本地文件主要依赖os库和shutil库。这两个库提供了丰富的功能,可以便捷地完成各种文件操作任务。首先,我们需要在代码中导入这两个模块:

import os
import shutil
import stat # 当然有的时候我们会想过滤掉隐藏文件,就可以调用这个包

1. 文件路径的操作

进行文件操作前,正确指定文件路径是基础。通常,我们使用 r 原始字符串标识符来定义文件路径,以避免转义字符带来的问题。例如:

folder_path = r"C:\Users\22330\Desktop\进行中"

确定路径后,即可在该目录下进行操作。若需组合多个路径片段,可以使用 os 模块中 path 子模块提供的 join 功能。该功能的作用是在路径间添加分隔符(如斜杠\)并连接路径,从而方便地访问子文件夹:

folder_path = r"C:\Users\22330\Desktop\进行中"
file_to_copy = os.path.join(folder_path, "testCopy")
print(file_to_copy) # C:\Users\22330\Desktop\进行中\testCopy

若需返回上一级目录,可以使用 dirname 函数实现:

folder_path = r"C:\Users\22330\Desktop\进行中"
parent_path = os.path.dirname(folder_path)
print(parent_path) # C:\Users\22330\Desktop

2. 复制

2.1 文件的复制

掌握路径操作后,接下来介绍文件复制。需要注意的是,os 模块本身并未直接提供文件复制功能,它主要提供基础的文件操作接口。因此,实现文件复制建议使用 shutil 模块,其功能更为便捷:

这里分为两种情况:第一种是不保留文件的元信息(如创建时间等),此时可使用 copy 方法:

folder_path = r"C:\Users\22330\Desktop\进行中\testCopy"
shutil.copy(os.path.join(folder_path, "1.jpg"), os.path.join(folder_path, "1_copy.jpg"))

注意,上述示例中将文件粘贴到了同一文件夹,此时文件的修改时间发生了变化,表明原始创建日期未被保留。

第二种情况是需要保留文件的元信息,此时应使用 copy2 方法:

folder_path = r"C:\Users\22330\Desktop\进行中\testCopy"
shutil.copy2(os.path.join(folder_path, "1.jpg"), os.path.join(folder_path, "1_copy2.jpg"))

通过观察可以发现,copy2 方法成功保留了文件的原始元信息。

2.2 文件夹的复制

在程序中,文件夹和文件是严格区分的。可以通过 os.path.isdir 或 os.path.isfile 函数进行判断:

例如,在 folder_path 路径下存在一个名为 1 的文件夹和一个名为 1.jpg 的图片文件,可以通过 isdir 和 isfile 函数来区分它们:

folder_path = r"C:\Users\22330\Desktop\进行中\testCopy"
print(os.path.isdir(os.path.join(folder_path, "1.jpg"))) # False
print(os.path.isfile(os.path.join(folder_path, "1.jpg"))) # True
print(os.path.isfile(os.path.join(folder_path, "1"))) # False
print(os.path.isdir(os.path.join(folder_path, "1"))) # True

在Python中,若需复制整个文件夹,可以使用 shutil 模块下的 copytree 方法,如下所示:

folder_path = r"C:\Users\22330\Desktop\进行中\testCopy"
# 两个参数,第一个是要复制的路径,第二个是存放的路径,同时可以进行文件夹名字的修改
shutil.copytree(os.path.join(folder_path,"1"), os.path.join(folder_path, "1_copy"))

3. 移动(剪切)

若需移动文件,可以通过 os 模块下的 rename 方法实现。以下是将1.jpg图片移动到上一级目录的示例:

folder_path = r"C:\Users\22330\Desktop\进行中\testCopy"
os.rename(os.path.join(folder_path,"1.jpg"), os.path.join(os.path.dirname(folder_path), "1.jpg"))

若需移动文件夹,可以使用 shutil.move 方法:

sourse_folder = r"C:\Users\22330\Desktop\进行中\testCopy\1"
destination_folder = r"C:\Users\22330\Desktop\进行中\new_location"
# 注意这种写法只是将 1 文件夹下所有文件移动到 new_location 下,并不会再在 new_location 下新建一个文件夹为 1
# 如果要保留1文件夹本身,那么就是写作 destination_folder = r"C:\Users\22330\Desktop\进行中\new_location\1"
shutil.move(sourse_folder, destination_folder)  # destination_folder如果不存在,会自动新建

或者,同样可以使用 os.rename 方法:

os.rename(sourse_folder, destination_folder) # destination_folder如果不存在,会自动新建

4. 删除

在Python中,若需删除文件夹,可以使用 os 模块下的 rmdir 方法:

del_folder = r"C:\Users\22330\Desktop\进行中\testCopy\1_copy"
os.rmdir(del_folder)

但该方法有一个限制:待删除的文件夹必须是空的。若尝试删除非空文件夹,程序将报错:

因此,更彻底的方式是使用 shutil 模块的 rmtree 方法:

del_folder = r"C:\Users\22330\Desktop\进行中\testCopy\1_copy"
shutil.rmtree(del_folder)

若需删除的是文件,可以使用 os 模块的 remove 方法或 unlink 方法:

del_file = r"C:\Users\22330\Desktop\进行中\testCopy\1_copy.jpg"
os.remove(del_file)
os.unlink(del_file) # unlink和remove 的功能一样

5. 新建

若需新建文件夹,可采用 os 模块下的 mkdir 或 makedirs 方法。后者多了一个 exist_ok 参数,用于指定当文件夹已存在时是否报错。例如,当文件夹已存在时,若使用 mkdir:

mk_folder = r"C:\Users\22330\Desktop\进行中\testCopy\testFolder"
os.mkdir(mk_folder)

则会报出如下错误:“[WinError 183] 当文件已存在时,无法创建该文件”

但若使用 makedirs 并设置 exist_ok = True,即可解决该问题:

mk_folder = r"C:\Users\22330\Desktop\进行中\testCopy\testFolder"
os.makedirs(mk_folder, exist_ok=True) # 不删除文件夹中原有的文件,且不报错

新建文件的情况则较为多样,例如 txt、xlsx、jpg、pptx 等格式。这里以创建一个最简单的 txt 文档为例:

mk_folder = r"C:\Users\22330\Desktop\进行中\testCopy\testFolder"
txt_to_make = os.path.join(mk_folder, "test.txt")
with open(txt_to_make, "w") as f: # w 代表的是写入状态
    f.write("这是一个测试文件")
f.close() # 关闭文件

6. 关于隐藏文件的处理方式

这涉及上文提到的一个重要包,即 stat。我们先查看目录下的隐藏文件:

若文件系统中未显示隐藏文件,默认情况下是看不见的,但程序仍能识别它们。

因此,我们可以通过以下程序打印出所有文件。listdir 用于罗列所有文件并返回一个列表,遍历该列表即可:

folder_dir = r"C:\Users\22330\Desktop\进行中"
for item in os.listdir(folder_dir):
    print(item)

可以发现,隐藏文件通常以 ~ 开头,有时也以 . 开头。若简单编写如下程序:

folder_dir = r"C:\Users\22330\Desktop\进行中"
for file in os.listdir(folder_dir):
    # 如果是隐藏文件,不显示
    if not file.startswith(".") and  not file.startswith("~"):
        print(file)

虽然看似可行,但容易误伤正常文件,例如某些文件确实以 ~ 开头:

因此,仅通过起始字符判断是不合理的,这就需要引入 stat 模块:

folder_dir = r"C:\Users\22330\Desktop\进行中"

for file in os.listdir(folder_dir):
    file_name = os.path.join(folder_dir,file)
    file_stat = os.stat(file_name) # 获取文件属性
    is_hidden = file_stat.st_file_attributes & stat.FILE_ATTRIBUTE_HIDDEN # 按位与 获取隐藏状态
    print(is_hidden) # 测试用,为2代表是隐藏文件,为0代表不是隐藏文件

    if not is_hidden:
        print(file)

7. 三个小案例

7.1 文件分类

假设你有一个名为 data 的文件夹(可自行新建用于测试),里面杂乱地存放着 .txt 文本文件和 .xlsx 文件,需要将它们分类整理。

import os
import shutil

folder_dir = r"C:\Users\22330\Desktop\进行中\data" # 文件夹路径
file_type = []
# 统计文件类型
for item in os.listdir(folder_dir):
    # 通过splitext获取文件扩展名,并去掉点号
    file_type.append(os.path.splitext(item)[1].replace(".","")) 
# 为不同文件类型创建文件夹
for tp in list(set(file_type)): # 通过set去重
    os.makedirs(os.path.join(folder_dir, tp), exist_ok=True)
# 移动文件到对应的文件夹
for item in os.listdir(folder_dir):
    if os.path.isfile(os.path.join(folder_dir, item)): # 如果是文件类型才进行移动
        tp = os.path.splitext(item)[1].replace(".","") # 获取文件类型
        shutil.move(os.path.join(folder_dir, item), os.path.join(folder_dir, tp, item))
        print(f"已移动: {item}")

7.2 清理空文件夹

场景描述:有时下载软件会产生许多空的临时文件夹,手动删除较为繁琐,编写程序进行自动化处理更为高效。

任务要求:

  • 遍历指定目录(仅遍历第一层)
  • 判断每个条目是否为文件夹(而非文件)
  • 若为文件夹且为空(内部无任何文件或子文件夹),则将其删除
import os

folder_dir = r"C:\Users\22330\Desktop\进行中\测试文件夹" # 文件夹路径
for item in os.listdir(folder_dir):
    if os.path.isdir(os.path.join(folder_dir, item)): # 如果是文件类型才进行判断
        if len(os.listdir(os.path.join(folder_dir, item))) == 0: # 根据枚举的长度判断是否为空文件夹
            os.rmdir(os.path.join(folder_dir, item)) # 如果是,则删除
            print(f"已删除空文件夹: {item}")

7.3 文件备份

场景描述:这是一个结合“隐藏文件过滤”和“复制”功能的综合案例。

任务要求:

  • 定义源目录 source 和备份目录 backup
  • 将 source 中的所有文件复制到 backup

关键难点:

  • 不复制隐藏文件(使用前述 stat 属性进行判断)
  • 不复制文件夹(仅复制文件)
  • 复制时保留文件的修改时间(元数据)
import os
import stat
import shutil

folder_dir = r"C:\Users\22330\Desktop\进行中" # 初始文件夹路径
backup_dir = os.path.join(folder_dir, "backup") # 备份文件夹路径
os.makedirs(backup_dir, exist_ok=True) # 备份文件夹

for item in os.listdir(folder_dir):
    if os.path.isfile(os.path.join(folder_dir, item)): # 排除文件夹类型
        file_stat = os.stat(os.path.join(folder_dir, item)) # 判断是否是隐藏文件
        is_hidden = file_stat.st_file_attributes & stat.FILE_ATTRIBUTE_HIDDEN
        if not is_hidden: # 如果不是隐藏文件,保留元数据复制
            shutil.copy2(os.path.join(folder_dir, item), os.path.join(backup_dir, item))
            print(f"已备份: {item}")

掌握代码操作文件系统是实现自动化的第一步。希望通过上述讲解,你能实现基本的文件系统操作。

到此,关于Python结合os模块和shutil模块实现本地文件自动化操作的介绍就结束了。更多相关Python文件自动化操作内容,请搜索本站以前的文章或继续浏览下面的相关文章。希望大家以后多多支持本站!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表