python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python操作文件夹

Python基础学习之文件夹常用操作的完整代码

作者:梦想三三

这篇文章主要为大家详细介绍了Python中os和sys模块的常用功能,涵盖文件/目录操作,系统信息和命令行交互三大部分,文中的示例代码讲解详细,有需要的小伙伴可以了解下

一、获取当前工作目录

import os
print(os.getcwd())  # 获取当前代码所在的绝对路径

获取当前 Python 脚本运行的工作目录(也就是代码文件所在的文件夹路径)。

os.getcwd() = get current working directory,返回的是字符串格式的绝对路径。

二、创建单个文件夹

import os
os.mkdir(r'数据1') # 在路径中创建一个新的文件夹

在当前工作目录下,创建一个名为数据1的文件夹。

os.mkdir() 只能创建单级文件夹(如果上级目录不存在,会报错)。

前面的r表示 “原始字符串”,可以避免路径中\被当成转义字符处理。

三、递归创建多级文件夹

import os
os.makedirs(r'数据104\内容b\内容a\内容c') # 递归来创建文件夹

一次性创建多级嵌套的文件夹(数据104内容b内容a内容c)。

mkdir的区别os.makedirs() 会自动创建所有不存在的上级目录,不会报错。

四、批量创建多个文件夹

import os
for i in range(1,201):
    file_name = '文件夹'+str(i)
    file_path = os.getcwd()+'\\数据1\\' + file_name
    os.mkdir(file_path)

数据1文件夹下,批量创建文件夹1文件夹200共 200 个文件夹。

逐行拆解

注意:如果数据1文件夹不存在,这段代码会报错,需要先手动创建,或者改用os.makedirs()

五、安全拼接路径

'''将参数拼接为目录路径'''
import os
dir_new= os.path.join(os.getcwd(), '数据2', '内容c')
print(dir_new)

安全拼接多个路径片段,生成一个完整的路径字符串。

自动适配不同操作系统的路径分隔符(Windows 用\,macOS/Linux 用/),代码跨平台不会出错。

避免手动写\\可能出现的错误。

示例输出:比如当前路径是D:\test,则输出D:\test\数据2\内容c。

六、切换工作目录

# 跳转路径
import os
print(os.getcwd())          # 切换前的路径
os.chdir('.\数据2')         # 改变当前地址的路径
print(os.getcwd())          # 切换后的路径

把 Python 脚本的当前工作目录,切换到数据2文件夹下。

逐行拆解

  1. print(os.getcwd()):打印切换前的路径。
  2. os.chdir('.\数据2')chdir = change directory,切换到当前目录下的数据2文件夹(.表示当前目录)。
  3. print(os.getcwd()):打印切换后的路径,验证是否切换成功。

后续的文件操作(比如读取 / 写入文件),都会以新的工作目录为基准路径。

七、判断路径是相对路径还是绝对路径

import os
a=os.path.isabs('数据2\\文件夹201') # 判断当前路径是相对路径还是绝对路径
b=os.path.isabs('D:\\soft\\pycharm\\code\\pythonProject\\书代码')
print(a,b)

判断传入的路径是否是绝对路径,返回True/False。

核心函数os.path.isabs(path)

绝对路径是从盘符(Windows)或根目录(Linux/macOS)开始的完整路径;相对路径是相对于当前工作目录的路径。

八、从路径中分离文件名和文件夹路径

import os
path = r'D:\soft\pycharm\code\pythonProject\书代码\第9章\数据2\文件夹201\a.txt'
file_name = os.path.basename(path) # 获取路径中的文件名
dir_name = os.path.dirname(path)   # 获取路径中的文件夹路径
file_dir_name = os.path.split(path)# 获取的文件路径和文件名以元组的形式返回
print(file_name, '\n', dir_name, '\n', file_dir_name)

os.path.basename(path):提取路径的最后一部分,也就是文件名(这里会返回a.txt)。

os.path.dirname(path):提取路径中除了文件名之外的部分,也就是文件夹路径(这里会返回D:\soft\pycharm\code\pythonProject\书代码\第9章\数据2\文件夹201)。

os.path.split(path):同时返回文件夹路径和文件名,结果是一个元组:(文件夹路径, 文件名)

运行结果示例:

a.txt 
D:\soft\pycharm\code\pythonProject\书代码\第9章\数据2\文件夹201 
('D:\\soft\\pycharm\\code\\pythonProject\\书代码\\第9章\\数据2\\文件夹201', 'a.txt')

九、查询文件大小

import os
path = r'D:\soft\pycharm\code\pythonProject\书代码\第9章\数据3\书代码.zip'
print(os.path.getsize(path)) # 获取路径中的文件所占用内存的大小

获取指定文件的大小,单位是字节(B)。

如果要换算成 KB/MB,可以用:print(os.path.getsize(path)/1024)(KB)、print(os.path.getsize(path)/1024/1024)(MB)。

注意:这个函数不能直接获取文件夹的总大小,需要遍历文件夹内的所有文件累加计算(后面的代码会讲到)。

十、删除文件和文件夹

删除单个文件

import os
os.remove(r'D:\soft\pycharm\code\pythonProject\书代码\第9章\数据4\文件夹201\b.txt')

删除指定路径的文件

只能删文件,不能删文件夹。

如果文件不存在会报错;删除前最好用os.path.exists()判断一下。

删除空文件夹

import os
os.rmdir(r'D:\soft\pycharm\code\pythonProject\书代码\第9章\数据4\文件夹1')

删除指定路径的空文件夹

只能删空文件夹,如果文件夹里有文件 / 子文件夹会报错。

想删除非空文件夹,需要用shutil.rmtree()(需要导入shutil模块)。

十一、文件 / 文件夹重命名

import os
# 批量重命名示例
for i in range(0,1):
    old = 'D:\\soft\\pycharm\\code\\pythonProject\\书代码\\第9章\\数据1\\数据2'
    new = 'D:\\soft\\pycharm\\code\\pythonProject\\书代码\\第9章\\数据1\\数据'+str(i+200)
    os.rename(old, new) # 对文件或文件夹进行重命名

# 递归重命名(可重命名多级路径)
os.renames('D:\\soft\\pycharm\\code\\pythonProject\\书代码\\第9章\\数据1\\数据200', 'D:\\soft\\pycharm\\code\\pythonProject\\书代码\\第9章\\数据1\\数据3\\书局')

os.rename(old, new):给文件 / 文件夹重命名,如果new路径不存在,直接改名;如果new路径存在,会报错(Windows 下)。

os.renames(old, new):支持重命名时同时修改上级目录(递归修改路径),如果上级目录不存在会自动创建。

注意:重命名前最好用os.path.exists()判断old路径是否存在,避免报错。

十二、创建硬链接

import os
os.link('D:\\soft\\pycharm\\code\\pythonProject\\书代码\\第9章\\第9章.rar', r'D:\\soft\\pycharm\\code\\pythonProject\\书代码\\第9章\\数据2\\1.rar')

为源文件创建一个硬链接,相当于给文件创建一个 “别名”,两个路径指向磁盘上的同一个文件内容,修改其中一个,另一个也会跟着变。

十三、获取目录下的所有文件名

import os
print('相对路径中有: ',os.listdir('.')) # 获取路径中的全部文件名

核心函数os.listdir(path)

返回指定路径下的所有文件和文件夹名称的列表。

示例os.listdir('.')中的.代表当前工作目录,所以会返回当前文件夹里的所有内容。

十四、计算当前目录下所有文件的总大小

import os
file_total_size = 0
for file_name in os.listdir('.'):
    file_dir = os.path.join(os.getcwd(), file_name)
    file_total_size += os.path.getsize(file_dir)
print(file_total_size)

逐行拆解

  1. file_total_size = 0:初始化总大小为 0。
  2. for file_name in os.listdir('.'):遍历当前目录下的所有文件 / 文件夹名。
  3. file_dir = os.path.join(os.getcwd(), file_name):拼接出文件的完整路径(避免直接用file_name导致路径错误)。
  4. file_total_size += os.path.getsize(file_dir):累加每个文件的大小到file_total_size中。
  5. print(file_total_size):输出当前目录下所有文件的总字节数。

注意:这个代码会把文件夹也当成文件计算(但os.path.getsize()对文件夹的返回值通常是目录本身的大小,不是内部文件的总和),所以更严谨的写法是先判断是否为文件。

十五、路径存在性 / 类型判断

import os
path = r'D:\soft\pycharm\code\pythonProject\书代码\第9章\数据2\文件夹201\a.txt'
print(os.path.exists(path)) # 判断path所指的文件或文件夹是否存在
print(os.path.isfile(path)) # 判断path是否为一个文件
print(os.path.isdir(path))  # 判断path是否为一个文件夹

核心函数

  1. os.path.exists(path):判断路径是否存在(不管是文件还是文件夹),存在返回True,不存在返回False
  2. os.path.isfile(path):判断路径是否存在且是一个文件,是则返回True
  3. os.path.isdir(path):判断路径是否存在且是一个文件夹,是则返回True

这些判断函数通常和增删改操作搭配使用,避免路径不存在导致程序报错。

十六、os.system()基础用法

import os
os.system('calc')  # 实现cmd的命令或终端的命令
os.system('D:\\soft\\Weixin\\Weixin.exe')

逐行说明

  1. os.system('calc'):执行 CMD 命令calc,打开 Windows 自带的计算器程序。
  2. os.system('D:\\soft\\Weixin\\Weixin.exe'):直接运行微信的可执行文件,相当于双击打开微信。

核心函数os.system(command)

执行操作系统的命令(Windows 的 CMD 命令、macOS/Linux 的终端命令),或者直接打开可执行程序。

执行命令时,会直接把命令的输出打印在控制台。

它的返回值是命令的退出状态码(执行成功返回0,失败返回非 0 值),不是命令的执行结果。

os.system() 运行 Python 脚本

import os
a = os.system(r"D:\soft\pycharm\code\pythonProject\书代码\第9章\第9章第3个程序.py")
print(a)

通过os.system()调用 Python 解释器,运行指定的.py脚本文件。

本质上等价于在 CMD 里执行命令:python D:\soft\pycharm\code\pythonProject\书代码\第9章\第9章第3个程序.py

print(a)会输出命令的退出状态码:脚本正常执行完成,返回0;脚本报错退出,返回非 0 值。

os.system()无法直接获取脚本运行时的打印输出,只能知道脚本执行是否成功。

十七、os.system()处理带空格的路径

import os
# 错误写法(带空格的路径会报错):
# os.system('D:\Program Files (x86)\Tencent\WeChat\WeChat.exe')

# 正确写法1:路径加引号包裹
os.system('"D:\\Program Files (x86)\\Tencent\\WeChat\\WeChat.exe"')

# 正确写法2:用原始字符串+路径
os.system(r'D:\soft\pycharm\code\pythonProject\书代码\第10章\2002年1月公司营收.xlsx')

当路径中包含空格(比如Program Files (x86)),os.system()会把空格当成命令参数分隔符,导致路径解析错误。

解决方法:

  1. 把带空格的路径用双引号包裹,比如"D:\Program Files (x86)\Tencent\WeChat\WeChat.exe"
  2. r原始字符串表示路径,同时确保路径没有转义字符问题。

补充:os.system()打开.xlsx文件时,会自动调用系统默认的 Excel 程序打开这个文件,相当于双击文件。

十八、os.popen()获取命令执行结果

import os
a = os.popen(r"python D:\soft\pycharm\code\pythonProject\书代码\第9章\第9章第3个程序.py", 'r')
print('jieshu: ', a.read()) # 获取执行命令后的结果

核心函数os.popen(command, mode)

执行系统命令,并返回一个文件对象,可以通过read()/readlines()读取命令的输出结果。

逐行说明

  1. os.popen(..., 'r'):以只读模式打开命令的输出流。
  2. a.read():读取命令执行时打印的所有输出内容(比如脚本里的print()结果)。

os.system()与os.popen()对比:

os.system():结果直接打印到终端,不保存到变量里,变量里只存了执行是否成功的状态码。

os.popen():结果被捕获保存到了变量里,需要你主动调用.read()才会显示出来。

作业

编写一个 Python 程序,使用 os 库完成以下操作:

第一步:在当前目录下创建一个名为 test_folder 的文件夹;

第二步:打印出当前程序的工作目录路径;

第三步:切换工作目录到刚创建的 test_folder 文件夹;

第四步:在 test_folder 文件夹内创建一个名为 test_file.txt 的空文件(提示:可结合 open 函数);

第五步:打印出 test_folder 文件夹内的所有文件 / 文件夹名称;

第六步:删除刚创建的 test_file.txt 文件;

第七步:切换回最初的工作目录,删除 test_folder 文件夹。

要求:代码中要包含必要的异常处理(比如文件夹已存在、文件不存在时的报错处理)

import os

# 记录初始工作目录,用于后续切换回去
original_dir = os.getcwd()

try:
    # 第一步:在当前目录下创建一个名为 test_folder 的文件夹
    if not os.path.exists('test_folder'):
        os.mkdir('test_folder')
        print("第一步:test_folder 文件夹创建成功")
    else:
        print("第一步:test_folder 文件夹已存在,跳过创建")

    # 第二步:打印出当前程序的工作目录路径
    print("\n第二步:当前工作目录路径:", os.getcwd())

    # 第三步:切换工作目录到刚创建的 test_folder 文件夹
    os.chdir('test_folder')
    print("\n第三步:已切换到 test_folder 目录,当前路径:", os.getcwd())

    # 第四步:在 test_folder 文件夹内创建一个名为 test_file.txt 的空文件
    # 使用 open 函数创建空文件,模式 'w' 表示写入模式(不存在则创建,存在则清空)
    with open('test_file.txt', 'w', encoding='utf-8') as f:
        pass
    print("\n第四步:test_file.txt 文件创建成功")

    # 第五步:打印出 test_folder 文件夹内的所有文件 / 文件夹名称
    contents = os.listdir('.')  # '.' 表示当前目录(即 test_folder)
    print("\n第五步:test_folder 内的内容:", contents)

    # 第六步:删除刚创建的 test_file.txt 文件
    if os.path.exists('test_file.txt'):
        os.remove('test_file.txt')
        print("\n第六步:test_file.txt 文件删除成功")
    else:
        print("\n第六步:test_file.txt 文件不存在,无法删除")

    # 第七步:切换回最初的工作目录,删除 test_folder 文件夹
    os.chdir(original_dir)
    print("\n第七步:已切换回初始工作目录,当前路径:", os.getcwd())

    if os.path.exists('test_folder'):
        os.rmdir('test_folder')  # rmdir 只能删除空文件夹,这里已经删了文件,所以可以用
        print("第七步:test_folder 文件夹删除成功")
    else:
        print("第七步:test_folder 文件夹不存在,无法删除")

except Exception as e:
    print(f"\n程序执行出错:{e}")
finally:
    # 无论是否出错,都确保切换回初始目录
    if os.getcwd() != original_dir:
        os.chdir(original_dir)
        print("\n已切换回初始工作目录")

代码流程说明

  1. 第一步:先判断test_folder是否存在,避免重复创建报错。
  2. 第二步:用os.getcwd()获取并打印当前路径。
  3. 第三步:用os.chdir()切换到test_folder目录。
  4. 第四步:用with open(..., 'w')创建空文件(with会自动关闭文件,更安全)。
  5. 第五步:用os.listdir('.')列出当前目录(test_folder)下的所有内容。
  6. 第六步:先判断文件是否存在,再用os.remove()删除文件。
  7. 第七步:先切换回初始目录,再用os.rmdir()删除空的test_folder文件夹。

异常处理说明

知识扩展

判断文件是否为 Zip 压缩文件

import zipfile
print(zipfile.is_zipfile('数据3\\书代码.zip'))

核心函数zipfile.is_zipfile(path)

判断指定路径的文件是否是合法的 ZIP 压缩文件,返回True/False

用途:在操作压缩包前做校验,避免处理损坏或非压缩文件时报错。

读取压缩包内的文件名

import zipfile
z = zipfile.ZipFile('数据3\\书代码.zip', 'r') # 打开一个压缩文件
print(z.namelist()) # 读取压缩文件中所包含的文件名称

核心对象zipfile.ZipFile(),用于操作压缩包的主对象。

参数说明

第一个参数:压缩包的路径。

第二个参数'r':以只读模式打开压缩包。

z.namelist():返回压缩包内所有文件 / 文件夹的路径列表,比如['num1.py', 'num2.py', 'data.txt']

解压压缩包中的所有文件

import zipfile
z = zipfile.ZipFile('数据3\\书代码.zip')
for f in z.namelist():
    z.extract(f, r'数据3') # 解压文件

核心函数z.extract(file_name, path)

将压缩包内的单个文件解压到指定路径。

逐行说明

  1. z.namelist()遍历压缩包内的所有文件名。
  2. z.extract(f, r'数据3'):把文件f解压到当前目录下的数据3文件夹中。

创建新的压缩包并添加文件

import zipfile
z = zipfile.ZipFile('数据3\\书代码新.zip', 'w')
z.write(r'数据3\num1.py')
z.write(r'数据3\num2.py')
z.close()

'w'表示以写入模式创建 / 打开压缩包,如果压缩包不存在则新建,存在则会清空原有内容。

z.write(file_path):将指定路径的文件添加到压缩包中。

批量压缩文件夹内的所有文件

import os, zipfile
z = zipfile.ZipFile('数据3\\压缩全.zip', 'w')
for file_name in os.listdir('.\\数据3'):
    if file_name != '压缩全.zip': # 避免把自己也压缩进去
        z.write('./数据3/'+file_name)
z.close()

遍历数据3文件夹下的所有文件,批量添加到压缩全.zip中。

os.listdir('.\\数据3'):获取文件夹内所有文件名。

if file_name != '压缩全.zip':排除正在创建的压缩包本身,避免循环压缩。

读取压缩包内文件的详细属性

import zipfile
z = zipfile.ZipFile('数据3\\书代码.zip', 'r')
print(z.infolist())
for f in z.infolist(): # 取压缩文件Zip中的文件属性
    print('文件名:', f.filename, end='\t')
    print('修改时间:', f.date_time, end='\t')
    print('CRC值:', f.CRC, end='\n\t')
    print('压缩后大小:', f.compress_size, end='\t')
    print('压缩前大小:', f.file_size)

核心函数z.infolist(),返回压缩包内所有文件的ZipInfo对象列表,每个对象包含文件的详细信息。

可以批量查看压缩包内文件的大小、修改时间,或者计算压缩率。

常用属性说明:

属性含义
f.filename文件在压缩包内的路径 / 名称
f.date_time文件的修改时间(元组格式:年,月,日,时,分,秒)
f.CRC文件的 CRC 校验值,用于验证文件完整性
f.compress_size文件压缩后的大小(字节)
f.file_size文件压缩前的原始大小(字节)

获取 Python 版本信息

import sys
print(sys.version)       # 获取当前Python的解释器版本号
print(sys.version_info)  # 获取解释器的版本信息

sys.version:返回 Python 解释器的版本字符串,比如 3.11.4 (main, ...)

sys.version_info:返回一个版本元组对象,包含主版本、次版本、微版本等信息,比如 sys.version_info(major=3, minor=11, micro=4, ...)

可以用来判断用户的 Python 版本,确保代码能在支持的版本上运行。

Python 版本校验

import sys
if (sys.version_info[0]*10 + sys.version_info[1])/10 < 3.8:
    print('您的Python版本过低,请安装Python 3.8及以上版本')
    sys.exit()
else:
    print("您的Python版本正确,代码将继续运行")
    print('hello world')

sys.version_info[0] 是主版本号(比如 3),sys.version_info[1] 是次版本号(比如 11)。

(主版本*10 + 次版本)/10 把版本号转为浮点数,比如3.11,和3.8比较。

sys.exit():直接终止程序运行,后面的代码不会再执行。

效果:如果用户的 Python 版本低于 3.8,程序会直接退出并提示升级;版本符合要求则继续运行。

获取系统与环境信息

import sys
print(sys.maxsize)       # 获取Python支持的对象中包含的最大数据长度
print(sys.platform)      # 获取当前计算机的操作系统
print(sys.copyright)     # 获取当前Python的版权信息
print(sys.executable)    # 获取当前Python解释器在计算机中的目录地址
print(sys.exec_prefix)   # Python安装根目录

sys.maxsize:返回系统中int类型的最大值(和系统位数有关,64 位系统是9223372036854775807)。

sys.platform:返回操作系统标识,Windows 是win32,Linux 是linux,macOS 是darwin

sys.executable:返回当前运行的 Python 解释器的完整路径,比如C:\Users\xxx\python.exe

sys.exec_prefix:返回 Python 的安装根目录,用于定位库文件位置。

命令行参数sys.argv基础用法

import sys
print(sys.argv)

sys.argv:是一个列表,包含了运行 Python 脚本时传入的所有命令行参数。

列表结构

sys.argv[0]:脚本本身的路径(固定是第一个元素)。

sys.argv[1:]:后面的元素是用户传入的参数。

示例:运行命令 python 第9章第5个程序.py -csys.argv 会是:

['D:\\soft\\pycharm\\code\\pythonProject\\书代码\\第9章\\第9章第5个程序.py', '-c']

命令行参数交互程序

import sys
import os

a = sys.argv
print(a)

for i in range(1, len(sys.argv)):
    if sys.argv[i] == '-h':
        print('''本代码的帮助
    -h:用于查询帮助
    -a:用于获取Python的所有关键字
    -c:用于获取Python安装的所有第三方库的列表''')
    if i > 1 and sys.argv[i-1] == '-h':
        num = sys.argv[i]
        print(f"你给-h参数传入的值是:{num}")
    if sys.argv[i] == '-a':
        print('开始查询Python的所有关键字:')
        help("keywords")
    if sys.argv[i] == '-c':
        print('开始查询Python安装的所有第三方库:')
        os.system('pip list')

这是一个命令行交互工具,通过不同的参数实现不同功能:

-h:显示帮助信息,还可以接收一个额外参数并打印。

-a:调用help("keywords"),列出 Python 的所有内置关键字。

-c:调用os.system('pip list'),列出当前环境安装的所有第三方库(和你截图里的效果一致)。

运行效果:触发-c分支,执行pip list命令,打印出了所有已安装的库。

以上就是Python基础学习之文件夹常用操作的完整代码的详细内容,更多关于Python操作文件夹的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文