Python结合os模块和shutil模块实现本地文件自动化操作
本文详细讲解如何利用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文件自动化操作内容,请搜索本站以前的文章或继续浏览下面的相关文章。希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









