Python 目录与文件的相关操作
一、基础知识
- 目录(文件夹):用于组织和存储文件的容器,可以包含多个文件和其他目录。
- 文件:存储数据的单元,可以是文本文件(如
.txt)、图片文件(如.jpg)、可执行文件(如.exe)等。
在Python中,我们主要通过os模块和shutil模块来操作目录和文件。os模块提供了丰富的操作系统相关功能,而shutil模块则专注于文件和文件集合的高级操作。
二、导入模块
在进行目录和文件操作之前,我们需要导入必要的模块:
import os
import shutil
三、os模块介绍
os模块
- Python内置的与操作系统文件相关的模块,该模块中语句的执行结果通常与操作系统有关,即有些函数的运行效果在Windows操作系统和MacOS系统中不一样。
| 函数名称 | 描述说明 |
|---|---|
| getcwd() | 获取当前的工作路径 |
| listdir(path) | 获取path路径下的文件和目录信息,如果没有指定path则获取当前路径下的文件和目录信息 |
| mkdir(path) | 在指定路径下创建目录(文件夹) |
| makedirs(path) | 创建多级目录 |
| rmdir(path) | 删除path下的空目录 |
| removedirs(path) | 删除多级目录 |
| chdir(path) | 把path设置为当前目录 change dir |
| walk(path) | 遍历目录树,结果为元组,包含所有路径名、所有目录列表和文件列表 |
| remove(path) | 删除path指定的文件 |
| rename(old,new) | 将old重命名为new |
| stat(path) | 获取path指定的文件信息 |
| startfile(path) | 启动path指定的文件 |
目录操作
(1)获取当前工作目录
current_dir = os.getcwd()
print("当前工作目录:", current_dir)
os.getcwd()函数用于获取当前工作目录的路径。当前工作目录是指Python程序运行时所在的目录。
(2)创建目录
# 创建单个目录
os.mkdir("test_dir")
print("创建目录'test_dir'成功")
os.makedirs('test') # 若目录存在,再创建相同名字的目录则报错:ileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: 'test'
# 创建多级目录
os.makedirs("test_dir/sub_dir")
print("创建多级目录'test_dir/sub_dir'成功")
-
os.mkdir()用于创建单个目录。 -
os.makedirs()用于创建多级目录,会自动创建中间的目录。 -
批量创建目录
'需求:在指定路径newdir下批量创建指定个数的目录(文件夹),如果newdir目录不存在,则创建'
import os
import os.path
# 函数式编程
# 创建文件
def create_dir(num):
# 在指定路径下创建文件
path = './newdir'
if os.path.exists(path):
pass
else:
os.mkdir(path)
for i in range(1,num+1):
s = 'new'+str(i)
dir = os.path.join(path,s)
os.mkdir(dir)
if __name__ == '__main__':
num = eval(input('请输入;要创建目录个数:'))
create_dir(num)
(3)列出目录内容
# 列出指定目录的内容
dir_contents = os.listdir("test_dir")
print("目录'test_dir'的内容:", dir_contents)
os.listdir()函数可以列出指定目录中的所有文件和子目录的名称。
(4)删除目录
# 删除单个空目录
os.rmdir("test_dir/sub_dir")
print("删除目录'test_dir/sub_dir'成功")
os.rmdir('./test') #./表示当前目录, 如果删除的目录不存在则报错:[WinError 2] 系统找不到指定的文件。: './test'
# 删除多级目录
os.removedirs('aa/bb/cc')
# 删除整个目录树(包括所有子目录和文件)
shutil.rmtree("test_dir")
print("删除目录'test_dir'及其所有内容成功")
-
os.rmdir()只能删除空目录。 -
os.removedirs(path) 删除多级目录 -
shutil.rmtree()可以删除整个目录树,包括所有子目录和文件,使用时需谨慎。
(5)改变当前路径
print('当前目录:', os.getcwd()) # 当前目录: D:\Softwares\Pycharm\project\study
os.chdir('D:/Softwares')
print('当前目录:', os.getcwd()) # 当前目录: D:\Softwares
os.chdir(path)把path设置为当前目录 change dir
(6)遍历目录树
# 遍历目录树 输出所有目录文件
for dirs,dirlst,filelst in os.walk('d:/Softwares/Pycharm/project'):
print(dirs)
print(dirlst)
print(filelst)
print('-----------')
walk(path)遍历目录树,结果为元组,包含所有路径名、所有目录列表和文件列表
文件操作
(1)创建文件
# 打开文件(如果文件不存在则创建)
with open("test_file.txt", "w") as file:
file.write("Hello, World!")
print("创建文件'test_file.txt'并写入内容成功")
使用open()函数以写入模式("w")打开文件,如果文件不存在则会自动创建。
-
批量创建文件:
需求:在指定路径下批量创建3000份文本文件,文件名格式为序号 物资类别 用户识别码组成
1)序号从0001到3000
2)物资类别包括:水果、烟酒、粮油、肉蛋、蔬菜
3)用户识别码为9位的随机十六进制数码
import os
import random
import os.path
# 函数式编程
def create_file():
filename_lst=[]
lst = ['水果','烟酒','粮油','肉蛋','蔬菜']
code =['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']
# 拼接
for i in range(1,30):
filename=''
if i < 10:
filename+='000'+str(i)
elif i < 100:
filename += '00'+str(i)
elif i < 1000:
filename += '0'+str(i)
else:
filename +=str(i)
# 拼接类别
filename += '_'+random.choice(lst)
# 拼接识别码
s = ''
for item in range(9): # 循环9次,识别码9位
s += random.choice(code)
filename += '_'+s
filename_lst.append(filename)
return filename_lst
# 创建文件
def create_dir():
# 在指定路径下创建文件
path = './data'
if os.path.exists(path):
pass
else:
os.mkdir(path)
for i in create_file():
files = os.path.join(path, i)+ '.txt'
with open(files,'w') as file:
pass
if __name__ == '__main__':
create_file()
create_dir()
(2)复制文件
shutil.copy("test_file.txt", "test_file_copy.txt")
print("复制文件'test_file.txt'为'test_file_copy.txt'成功")
shutil.copy()函数可以将一个文件复制到新的位置或重命名为新的文件名。
(3)移动文件
shutil.move("test_file_copy.txt", "test_dir/test_file_copy.txt")
print("移动文件'test_file_copy.txt'到'test_dir'目录成功")
shutil.move()函数可以将文件移动到指定的目录。
(4)删除文件
os.remove("test_file.txt")
print("删除文件'test_file.txt'成功")
os.remove()函数用于删除指定的文件。
(5)获取文件属性
import time
def date_time(longtime):
s = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(longtime))
return s
# 获取文件属性信息
info = os.stat('aa.txt')
print(type(info),info)
# <class 'os.stat_result'> os.stat_result(st_mode=33206, st_ino=15481123719106098, st_dev=8090942432323898290, st_nlink=1, st_uid=0, st_gid=0, st_size=37, st_atime=1745415865, st_mtime=1745070442, st_ctime=1745070264)
print('文件创建时间:',date_time(info.st_ctime)) # 文件创建时间: 2025-04-19 21:44:24
print('最后一次访问时间:',date_time(info.st_atime)) # 最后一次访问时间: 2025-04-23 21:44:25
print('最后一次修改时间:',date_time(info.st_mtime)) # 最后一次修改时间: 2025-04-19 21:47:22
print('文件大小:',info.st_size) # 文件大小: 37
os.stat()函数可以获取文件的属性,如大小、创建时间、修改时间等。
(6)改名
文件: os.rename('a.txt','aa.txt')
目录:os.rename('test','dir')
rename(old,new) 将old重命名为new
(7)启动路径下的文件
os.startfile('calc.exe') # 打开计算器
startfile(path) 启动path指定的文件
综合示例
以下是一个综合示例,演示如何在Python中进行目录和文件的常见操作:
import os
import shutil
# 创建目录
os.mkdir("example_dir")
print("创建目录'example_dir'成功")
# 创建文件
with open("example_dir/example_file.txt", "w") as file:
file.write("This is an example file.")
print("创建文件'example_dir/example_file.txt'并写入内容成功")
# 复制文件
shutil.copy("example_dir/example_file.txt", "example_dir/example_file_copy.txt")
print("复制文件'example_dir/example_file.txt'为'example_dir/example_file_copy.txt'成功")
# 移动文件
shutil.move("example_dir/example_file_copy.txt", "example_file_copy.txt")
print("移动文件'example_dir/example_file_copy.txt'到当前目录成功")
# 获取文件属性
file_stat = os.stat("example_file_copy.txt")
print("文件'example_file_copy.txt'的属性:", file_stat)
# 删除文件
os.remove("example_file_copy.txt")
print("删除文件'example_file_copy.txt'成功")
# 删除目录
os.rmdir("example_dir")
print("删除目录'example_dir'成功")
注意事项
- 在进行文件和目录操作时,要注意路径的正确性,避免出现路径错误导致操作失败。
- 删除文件和目录是不可逆的操作,使用
os.remove()和shutil.rmtree()等函数时要格外小心,确保不会误删重要数据。 - 不同操作系统(如Windows、Linux、macOS)的文件路径格式可能有所不同,Windows使用反斜杠
\作为路径分隔符,而Linux和macOS使用正斜杠/。Python的os模块会自动处理路径分隔符的差异,但在手动拼接路径时需要注意。
四、os.path模块
- 是os模块的子模块,也提供了一些目录或文件的操作函数
| 函数名称 | 描述说明 |
|---|---|
| abspath(path) | 获取目录或文件的绝对路径 |
| exists(path) | 判断目录或文件在磁盘上是否存在,结果为bool类型,如果目录或文件在磁盘上存在,结果为True,否则为False |
| join(path,name) | 将目录与目录名或文件名进行拼接,相当于字符串的“+”操作 |
| splitext() | 分别获取文件名和后缀名 |
| basename(path) | 从path中提取文件名 |
| dirname(path) | 从path中提取路径(不包含文件名) |
| isdir(path) | 判断path是否是有效路径 |
| isfile(path) | 判断file是否是有效文件 |
(1)abspath(path)
- 功能:获取目录或文件的绝对路径。
- 示例代码:
import os.path
relative_path = "example_dir/example_file.txt"
absolute_path = os.path.abspath(relative_path)
print("相对路径:", relative_path)
print("绝对路径:", absolute_path)
- 输出示例:
相对路径: example_dir/example_file.txt
绝对路径: /home/user/example_dir/example_file.txt
- 说明:
abspath()会将相对路径转换为绝对路径,这对于路径处理非常有用,尤其是在跨平台开发中。
(2)exists(path)
- 功能:判断目录或文件在磁盘上是否存在。
- 返回值:布尔值,如果路径存在返回
True,否则返回False。 - 示例代码:
import os.path
path = "example_dir/example_file.txt"
if os.path.exists(path):
print(f"路径 {path} 存在")
else:
print(f"路径 {path} 不存在")
- 输出示例:
路径 example_dir/example_file.txt 存在
- 说明:
exists()可以用来检查路径是否存在,无论是文件还是目录。
(3)join(path, name)
- 功能:将目录与目录名或文件名进行拼接。
- 示例代码:
import os.path
directory = "example_dir"
file_name = "example_file.txt"
full_path = os.path.join(directory, file_name)
print("拼接后的路径:", full_path)
- 输出示例:
拼接后的路径: example_dir/example_file.txt
- 说明:
join()会根据操作系统自动选择正确的路径分隔符(Windows是\,Linux和macOS是/),避免了手动拼接路径时可能出现的错误。
(4)splitext(path)
- 功能:分别获取文件名和后缀名。
- 返回值:一个元组,包含文件名和扩展名。
- 示例代码:
import os.path
file_path = "example_dir/example_file.txt"
file_name, file_extension = os.path.splitext(file_path)
print("文件名:", file_name)
print("扩展名:", file_extension)
- 输出示例:
文件名: example_dir/example_file
扩展名: .txt
- 说明:
splitext()可以方便地分离文件名和扩展名,这对于文件类型判断和处理非常有用。
(5)basename(path)
- 功能:从路径中提取文件名。
- 示例代码:
import os.path
file_path = "example_dir/example_file.txt"
file_name = os.path.basename(file_path)
print("文件名:", file_name)
- 输出示例:
文件名: example_file.txt
- 说明:
basename()会提取路径中的最后一部分,通常是一个文件名或目录名。
(6)dirname(path)
- 功能:从路径中提取路径(不包含文件名)。
- 示例代码:
import os.path
file_path = "example_dir/example_file.txt"
directory = os.path.dirname(file_path)
print("目录路径:", directory)
- 输出示例:
目录路径: example_dir
- 说明:
dirname()会提取路径中的目录部分,不包括文件名。
(7)isdir(path)
- 功能:判断路径是否是一个有效的目录。
- 返回值:布尔值,如果是目录返回
True,否则返回False。 - 示例代码:
import os.path
path = "example_dir"
if os.path.isdir(path):
print(f"路径 {path} 是一个目录")
else:
print(f"路径 {path} 不是一个目录")
- 输出示例:
路径 example_dir 是一个目录
- 说明:
isdir()可以用来检查路径是否为目录。
(8)isfile(path)
- 功能:判断路径是否是一个有效的文件。
- 返回值:布尔值,如果是文件返回
True,否则返回False。 - 示例代码:
import os.path
path = "example_dir/example_file.txt"
if os.path.isfile(path):
print(f"路径 {path} 是一个文件")
else:
print(f"路径 {path} 不是一个文件")
- 输出示例:
路径 example_dir/example_file.txt 是一个文件
- 说明:
isfile()可以用来检查路径是否为文件。
综合示例
以下是一个综合示例,演示如何在Python中使用os.path模块进行路径操作:
import os.path
# 创建目录和文件
os.mkdir("example_dir")
with open("example_dir/example_file.txt", "w") as file:
file.write("This is an example file.")
# 获取绝对路径
relative_path = "example_dir/example_file.txt"
absolute_path = os.path.abspath(relative_path)
print("相对路径:", relative_path)
print("绝对路径:", absolute_path)
# 判断路径是否存在
if os.path.exists(absolute_path):
print(f"路径 {absolute_path} 存在")
else:
print(f"路径 {absolute_path} 不存在")
# 分离文件名和扩展名
file_name, file_extension = os.path.splitext(absolute_path)
print("文件名:", file_name)
print("扩展名:", file_extension)
# 提取文件名和目录路径
file_name_only = os.path.basename(absolute_path)
directory_path = os.path.dirname(absolute_path)
print("文件名:", file_name_only)
print("目录路径:", directory_path)
# 判断是否为目录或文件
if os.path.isdir(directory_path):
print(f"路径 {directory_path} 是一个目录")
if os.path.isfile(absolute_path):
print(f"路径 {absolute_path} 是一个文件")
# 清理
os.remove(absolute_path)
os.rmdir(directory_path)
print("清理完成")
注意事项
- 路径分隔符:不同操作系统的路径分隔符不同,Windows使用
\,而Linux和macOS使用/。os.path模块会自动处理这些差异,但在手动拼接路径时要注意。 - 路径存在性检查:在进行文件或目录操作之前,最好先使用
exists()或isdir()、isfile()等函数检查路径是否存在,避免出现错误。 - 路径拼接:尽量使用
os.path.join()来拼接路径,而不是手动使用字符串拼接,这样可以避免因路径分隔符不同而导致的错误。

浙公网安备 33010602011771号