Python模块之os模块

发布时间 2024-01-02 20:41:55作者: Lea4ning

os模块

【一】概要

  • os(operate system)

  • os 模块是 Python 标准库中用于与操作系统进行交互的模块。它提供了许多用于处理文件和目录、执行命令等操作系统级别功能的函数。

【二】常见用法

  1. 文件和目录操作:
    • os.getcwd(): 获取当前工作目录。
    • os.chdir(path): 切换当前工作目录。
    • os.listdir(path='.'): 返回指定目录下的所有文件和目录的列表。
    • os.mkdir(path): 创建目录。
    • os.makedirs(path): 递归创建多层目录。
    • os.remove(path): 删除文件。
    • os.rmdir(path): 删除目录。
    • os.removedirs(path): 递归删除多层目录。
  2. 路径操作:
    • os.path.join(path, *paths): 将多个路径组合成一个路径。
    • os.path.abspath(path): 返回路径的绝对路径。
    • os.path.basename(path): 返回路径的基本名称。
    • os.path.dirname(path): 返回路径的目录名称。
    • os.path.exists(path): 判断路径是否存在。
    • os.path.isfile(path): 判断路径是否为文件。
    • os.path.isdir(path): 判断路径是否为目录。
  3. 系统环境变量:
    • os.environ: 包含系统环境变量的字典。
    • os.environ.get('VAR_NAME'): 获取指定环境变量的值。
  4. 执行系统命令:
    • os.system(command): 在子shell中执行系统命令。
  5. 文件和目录状态:
    • os.stat(path): 获取文件或目录的状态信息。
  6. 路径拆分:
    • os.path.split(path): 将路径拆分为目录和文件名。
  7. 路径拓展:
    • os.path.expanduser(path): 展开 ~~user
    • os.path.expandvars(path): 展开环境变量。
  8. 进程控制:
    • os.fork(): 在 Unix 系统中创建子进程。
    • os.kill(pid, signal): 向进程发送信号。

【三】详解

【1】文件和目录操作:

os.getcwd(): 获取当前工作目录。

import os
res = os.getcwd()
print(res)
# D:\Files\Python\pythonProject1

os.chdir(path): 切换当前工作目录。

import os

# 执行文件的工作目录
res = os.getcwd()
print(res)  # D:\Files\Python\pythonProject1
# 指定文件的工作目录
os.chdir(r"D:\Files\Python\pythonProject1\test")
# 当前工作目录为修改后的test文件目录下
# 以下做的所有修改均在test文件目录下,如创建文件等
res = os.getcwd()
print(res)  # D:\Files\Python\pythonProject1\test

image-20240102171447191

os.listdir(path='.'): 返回指定目录下的所有文件和目录的列表。

import os

# os.getcwd() 当前的文件路径
print(os.listdir(os.getcwd()))

# ['.idea', '000.py', 'test', 'test.py', 'test_outer', '__pycache__']
# .xxx的文件是隐藏文件

os.mkdir(path): 创建目录。

  • 如果文件夹已经存在将会报错
    • [WinError 183] 当文件已存在时,无法创建该文件。: 'test_outer'
import os

os.mkdir(path='test_outer')
# 在当前文件目录下创建 test_outer 文件夹

os.mkdir(path=r'D:\Files\Python\pythonProject1\test\test_inner')
# 可以通过绝对路径创建文件夹
  • 无法创建文件,只可以创建文件夹
import os

os.mkdir(path='test_outer.json')

image-20240102172158663

os.makedirs(path): 递归创建多层目录。

import os

# mkdir 是无法创建多层目录的
os.mkdir(r'D:\Files\Python\pythonProject1\test\test1')
# [WinError 3] 系统找不到指定的路径。: 'D:\\Files\\Python\\pythonProject1\\test\\test1'


# 需要使用makedirs
os.makedirs(r'D:\Files\Python\pythonProject1\test\test1')

image-20240102172429521

os.remove(path): 删除文件。

import os

os.remove(r'D:\Files\Python\pythonProject1\test\test1\0021.py')
# 通过路径删除 0021.py 文件

'''不能删除文件夹'''
os.remove(r'D:\Files\Python\pythonProject1\test\test1')
# PermissionError: [WinError 5] 拒绝访问。: 'D:\\Files\\Python\\pythonProject1\\test\\test1'

os.rmdir(path): 删除目录。

import os

os.rmdir(r'D:\Files\Python\pythonProject1\test\test1')
# 通过路径删除 test1 这个文件夹

'''需要在文件夹下没有文件了,才可以删除,如果不为空,则会报错'''
# OSError: [WinError 145] 目录不是空的: 'D:\\Files\\Python\\pythonProject1\\test\\test1'

os.removedirs(path): 递归删除多层目录。

import os

os.removedirs('test/test1')
# 递归删除 test 文件目录下的所有文件目录

'''同样需要在文件夹下没有文件了,才可以删除,如果不为空,则会报错'''
# OSError: [WinError 145] 目录不是空的

【2】路径操作:

os.path.join(path, *paths): 将多个路径组合成一个路径。

import os

# 当前文件目录的绝对路径
now_path = os.getcwd()
res = os.path.join(now_path, 'test.py')
print(res)
# D:\Files\Python\pythonProject1\test.py
'''可以只传递一个参数,但失去了拼接路径的功能了就'''
res = os.path.join('test.py')
print(res)
# test.py

'''也可以拼接两个文件夹参数'''
res = os.path.join('1', 'test.py')
print(res)
# 1\test.py

os.path.abspath(path): 返回路径的绝对路径。

import os

res = os.path.join('1', 'test.py')   # 1\test.py
abs_path = os.path.abspath(res)
print(abs_path)
# D:\Files\Python\pythonProject1\1\test.py

os.path.basename(path): 返回路径的基本名称。

import os

res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', '3.py')
base_name = os.path.basename(res)
print(base_name)
# 3.py
# 返回最后一层的文件名称
'''也可以是文件夹'''
import os

res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', 'folder')
base_name = os.path.basename(res)
print(base_name)
# folder

os.path.dirname(path): 返回路径的目录名称。

'''与basename刚好相反,返回的是最后一级目录之前的路径'''
import os

res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', 'folder')
dir_name = os.path.dirname(res)
print(dir_name)
# D:\Files\Python\pythonProject1\outer\inner

os.path.exists(path): 判断路径是否存在。

'''判断路径是否存在'''
import os

res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', 'folder')
is_exists = os.path.exists(res)
print(is_exists)
# False
# 文件夹folder我并没有创建,所以是False

os.mkdir(res)  # 创建文件夹
is_exists = os.path.exists(res)
print(is_exists)
# True

os.path.isfile(path): 判断路径是否为文件。

import os

res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', 'folder')
is_exists = os.path.isfile(res)
print(is_exists)
# False

res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', '3.py')
is_exists = os.path.isfile(res)
print(is_exists)
# True

os.path.isdir(path): 判断路径是否为目录。

import os

res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', 'folder')
is_exists = os.path.isdir(res)
print(is_exists)
# True

res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', '3.py')
is_exists = os.path.isdir(res)
print(is_exists)
# False

【3】文件信息

os.path.getatime(path): 获取文件或目录的最后访问时间

  • Access Time (atime): 表示文件或目录最后一次被访问的时间。即文件内容最后一次被读取的时间。在某些系统上,读取文件内容时,文件的 atime 会被更新
import os
import time

res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', '3.py')
atime = os.path.getatime(res)
# 时间戳格式
print(atime)  # 1704192670.7195954
# 格式化时间戳
time_strf = time.strftime("%x %X", time.localtime(atime))
print(time_strf)  # 01/02/24 18:51:10

os.path.getctime(path): 获取文件或者目录的创建时间

  • Change Time (ctime): 表示文件或目录的状态发生变化的时间。这包括文件的元数据(比如权限)的修改,或者文件内容的变化。在某些系统上,文件内容发生变化时,文件的 ctime 会被更新。
import os
import time

res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', '3.py')
ctime = os.path.getctime(res)
# 时间戳格式
print(ctime)  # 1704188099.065199
# 格式化时间戳
time_strf = time.strftime("%x %X", time.localtime(ctime))
print(time_strf)  # 01/02/24 17:34:59

os.path.getmtime(path): 返回文件或路径的最后修改时间

  • Modification Time (mtime): 表示文件内容最后一次被修改的时间。即文件的实际内容被修改的时间。在文件内容发生变化时,文件的 mtime 会被更新
import os
import time

res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', '3.py')
mtime = os.path.getmtime(res)
# 时间戳格式
print(mtime)  # 1704192670.7195954
# 格式化时间戳
time_strf = time.strftime("%x %X", time.localtime(mtime))
print(time_strf)  # 01/02/24 18:51:10

os.path.getsize(path): 返回文件的大小

import os

res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', '3.py')
file_size = os.path.getsize(res)
print(file_size)
# 25

image-20240102185405943

os.stat(path): 获取文件夹/文件详细信息

import os

res = os.path.join(r'D:\Files\Python\pythonProject1\outer\inner', '3.py')
file_stat = os.stat(res)
print(file_stat)
# os.stat_result(st_mode=33206, st_ino=1970324837048557, st_dev=**********, st_nlink=1, st_uid=0, st_gid=0, 
# st_size=25, st_atime=1704192832, st_mtime=1704192787, st_ctime=1704188099)
  1. st_mode (文件的模式/权限): 包含文件的权限信息。可以使用 stat.S_ISDIR(mode)stat.S_ISREG(mode) 等函数来判断文件的类型。
  2. st_ino (inode 号): 包含文件的 inode 号,唯一标识文件在文件系统中的位置。
  3. st_dev (设备号): 包含文件所在设备的标识符。
  4. st_nlink (硬链接数): 包含文件的硬链接数。如果文件有多个硬链接,该数值大于 1。
  5. st_uid (用户 ID): 包含文件所有者的用户 ID。
  6. st_gid (组 ID): 包含文件所属组的组 ID。
  7. st_size (文件大小): 包含文件的大小,以字节为单位。
  8. st_atime (最后访问时间): 包含文件的最后访问时间。
  9. st_mtime (最后修改时间): 包含文件的最后修改时间。
  10. st_ctime (创建时间): 包含文件的创建时间。

【4】查看分隔符等

os.sep: 用于表示操作系统路径中的路径分隔符的字符串

import os

print(os.sep)  # \

path = "D:" + os.sep + "files" + os.sep + "000.py"
print(path)  # D:\files\000.py
  • win下为 \
  • Linux下为/

os.linesep:用于表示当前操作系统的换行符。

import os

print(os.linesep)

path = "a" + os.linesep + "b"
print(path)
# a
# b
  • Windows 上是 \r\n
  • Unix/Linux 上是 \n

os.pathsep:用于分隔文件路径的字符串

import os

print(os.pathsep)  # ;
  • 在 Unix/Linux 系统上,它通常是 ':'(冒号)
  • 在 Windows 系统上,它通常是 ';'(分号)

image-20240102195152590

os.name:表示当前操作系统的名称

import os

print(os.name)   # nt
  • 'posix': 表示 Unix/Linux 系统。
  • 'nt': 表示 Windows 系统。
  • 'os2': 表示 OS/2 系统。
  • 'ce': 表示 Windows CE 系统。
  • 'java': 表示 Java 环境。

【5】执行系统命令

os.system(command): 运行shell命令

  • command :"bash command" 由bash解释器执行的shell命令
    • bash解释器相当于python解释器
import os

os.system("tasklist")
  • 相当于 在cmd中输入tasklist

image-20240102191026494

os.popen(command).read(): 运行shell命令,获取执行结果

import os

task_list = os.popen("tasklist").read()
print(task_list)
print(type(task_list))   # <class 'str'>
  • 可以通过变量接收值
    • os.system只能执行,而os.popen().read()可以接收值

image-20240102191155747

【四】小练习

【0】__file__ :获取当前文件的绝对路径

【1】列举出指定文件夹下的所有文件

import os

# 根路径
BASE_DIR = os.path.dirname(__file__)
# 视频路径
media_path = os.path.join(BASE_DIR, 'media')

# 文件列表
file_list = os.listdir(media_path)
# 文件字典 索引作键,文件名作值
media_menu = {}
for index, value in enumerate(file_list):
    media_menu[index + 1] = value

while True:
    for k, v in media_menu.items():
        print(f"{k} | {v}")
    choice = input("请输入查看的文件编号:").strip()
    if choice.isdigit():
        choice = int(choice)
        if choice not in media_menu.keys():
            print("编号不存在!")
            continue
        else:
            mp4_path = os.path.join(media_path, media_menu[choice])
            with open(mp4_path, 'rb') as fp:
                data = fp.read()
                print(data)
    else:
        print("请输入编号!")
        continue
        
'''
1 | media1.mp4
2 | media2.mp4
3 | media3.mp4
请输入查看的文件编号:1
b''    # 没有内容,所以此处为空
'''