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'成功")

注意事项

  1. 在进行文件和目录操作时,要注意路径的正确性,避免出现路径错误导致操作失败。
  2. 删除文件和目录是不可逆的操作,使用os.remove()shutil.rmtree()等函数时要格外小心,确保不会误删重要数据。
  3. 不同操作系统(如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("清理完成")

注意事项

  1. 路径分隔符:不同操作系统的路径分隔符不同,Windows使用\,而Linux和macOS使用/os.path模块会自动处理这些差异,但在手动拼接路径时要注意。
  2. 路径存在性检查:在进行文件或目录操作之前,最好先使用exists()isdir()isfile()等函数检查路径是否存在,避免出现错误。
  3. 路径拼接:尽量使用os.path.join()来拼接路径,而不是手动使用字符串拼接,这样可以避免因路径分隔符不同而导致的错误。
posted @ 2025-04-23 22:18  kyle_7Qc  阅读(215)  评论(0)    收藏  举报