目录

一、获取当前工作目录

二、创建单个文件夹

三、递归创建多级文件夹

四、批量创建多个文件夹

五、安全拼接路径

六、切换工作目录

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

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

九、查询文件大小

十、删除文件和文件夹

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

十二、创建硬链接

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

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

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

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

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

作业:

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

二、读取压缩包内的文件名

三、解压压缩包中的所有文件

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

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

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

一、获取 Python 版本信息

二、Python 版本校验

三、获取系统与环境信息

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

五、命令行参数交互程序


一、获取当前工作目录

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 个文件夹。

逐行拆解

range(1,201):循环 1 到 200(共 200 次)。

file_name = '文件夹'+str(i):拼接出文件夹名,比如文件夹1文件夹2

file_path = os.getcwd()+'\\数据1\\' + file_name:拼接出完整路径,比如当前路径\数据1\文件夹1

os.mkdir(file_path):创建该文件夹。

注意:如果数据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)

  • a的路径'数据2\\文件夹201'没有盘符,是相对路径 → a=False
  • b的路径以D:\开头,是完整的绝对路径 → b=True

绝对路径是从盘符(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')

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

    • 硬链接只能在同一个磁盘分区内创建,不能跨分区。
    • 更常用的文件复制方法是shutil.copy()/shutil.copy2()(需要导入shutil模块),比硬链接更直观

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

    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文件夹。

    异常处理说明

    • try-except捕获所有可能的异常(比如权限不足、路径错误等),并打印错误信息。
    • finally确保无论程序是否出错,最后都会切换回初始工作目录,避免后续操作路径混乱。
    • 每一步操作前都加了os.path.exists()判断,避免因文件 / 文件夹不存在或已存在导致报错。

    一、判断文件是否为 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命令,打印出了所有已安装的库。

    更多推荐