Skip to content

OS 系统操作 ​

在日常使用计算机时,经常需要列出一个文件夹或者目录的内容,创建和删除文件,以及做其他一些比较无聊但是不得不做的“家务活”。在 Python 程序中可以做到同样的事,甚至能做更多的事。这些功能是否能减少你的工作量呢?我们拭目以待。

Python 在模块 os(操作系统,operating system)中提供了许多系统函数,本章的所有程序都需要导入这个模块。

Python 的 os 模块封装了常见的文件和目录操作,本文只列出部分常用的方法,更多的方法可以查看官方文档。

os 目录操作 ​

方法说明
os.mkdir创建目录
os.rmdir删除目录
os.rename重命名
os.remove删除文件
os.getcwd获取当前工作路径
os.chdir修改当前工作目录
os.listdir获取当前目录下的路径

创建文件夹 ​

创建文件目录。

python
os.mkdir('testdir')

如果目录已经存在了,再次创建就会报错。所以在创建之前最好是判断一下

删除文件夹 ​

删除文件目录。

python
os.rmdir('testdir')

重命名文件 ​

重命名文件。如果文件不存在则报错

python
os.rename('test.txt', 'test.py')

删除文件 ​

删除文件,文件不存在时报错

python
os.remove('test.py')

获取工作目录 ​

显示当前程序的工作目录

python
>>> os.getcwd()
>>> 'C:\\Users\\Administrator'

改变工作目录 ​

改变程序的工作目录

python
>>> os.getcwd()
'C:\\Users\\Administrator'
>>> os.chdir('C:\\')
>>> os.getcwd()
'C:\\'

os.path 路径操作 ​

os.path 模块是跨平台的,即使不打算在平台之间移植自己的程序也应该用 os.path,好处多多。

方法说明
os.path.split分割文件名与目录
os.path.join连接目录与文件名
os.path.abspath获取绝对路径
os.path.dirname获取路径
os.path.basename获取文件名或文件夹名
os.path.splitext分离文件名与扩展名
os.path.isfile判断给出的路径是否是一个文件
os.path.isdir判断给出的路径是否是一个目录
os.path.exists检查文件是否存在
python
>>> os.getcwd()
'C:\\Users\\Administrator'

>>> os.path.abspath('hello.py')
'C:\\Users\\Administrator\\hello.py'

>>> os.path.abspath('.')
'C:\\Users\\Administrator'

分割路径 ​

  • os.path.split(path):分离目录与文件名,函数将路径分成两个独立的部分,并返回一个tuple 结果。第二个元素是路径的最后一个元素,第一个元素是它之前的所有元素。
  • os.path.join(seq):函数能将两个或者多个独立部分,拼接为一个路径。
python
>>> os.path.split(os.path.abspath('.'))
('C:\\Users', 'Administrator')

>>> os.path.join('C:\\Users', 'Administrator')
'C:\\Users\\Administrator'

分离文件名与扩展名 ​

  • os.path.splitext:分离文件名与扩展名

    splitext()类似于split(),但在扩展分隔符上划分路径,而不是目录分隔符。

python
>>> os.path.splitext('filename.txt')
('filename', '.txt')

案例:

在测试文件夹下,给所有的 txt 文件前加上前缀 [前缀] 两个字

案例:操作路径 ​

python
import os.path

# 在操作路径的时候都是相对路径,在写入文件的时候一般用绝对路径 将相对路径与绝对路径进行转化
root = __file__
print('__file__', root)  # 文件的绝对路径

root_dir = os.path.dirname(root)
print('os.path.dirname', root_dir)  # 目录的绝对路径

# 获取目录的绝对路径
print('os.path.abspath', os.path.abspath('.'))

# 分离目录
print('os.path.split', os.path.split(root_dir))

d1 = 'day1'
d2_1 = 'python'
d2_2 = 'java'
# os.path.join 会根据操作系统识别路径分隔符
print('os.path.join', os.path.join(d1, d2_1))
print('os.path.join', os.path.join('day1', 'python', 'base'))

检查路径 ​

  • os.path.dirname:获取文件或文件夹的路径
python
>>> os.path.dirname('C:\\Users\\Administrator\\hello.py')
'C:\\Users\\Administrator'

>>> os.path.dirname('C:\\Users\\Administrator\\python')
'C:\\Users\\Administrator'

>>> os.path.dirname('C:\\Users\\Administrator')
'C:\\Users'
  • os.path.basename:获取文件名或文件夹名
python
>>> os.path.basename('C:\\Users\\Administrator\\hello.py')
'hello.py'

>>> os.path.basename('/Users/ethan/coding/python')
'python'
  • os.path.isfile/os.path.isdir 判断给出的路径是否是一个文件/目录
python
>>> os.path.isfile('C:\\Users\\Administrator\\hello.py')
True

>>> os.path.isfile('C:\\Users\\Administrator\\hello1.py')
False

>>> os.path.isdir('C:\\Users\\Administrator\\hello1.py')
False

>>> os.path.isdir('C:\\Users\\Administrator')
True

案例:

显示当前目录中所有的目录

python
>>> [x for x in os.listdir('.') if os.path.isdir(x)]

案例:检查路径 ​

python
import os.path

filename = '01 目录操作.py'
dir_name = 'code'
# isfile 判断某个路径是不是文件
print(os.path.isfile(filename), os.path.isfile(dir_name))
# isdir 判断某个路径是不是目录
print(os.path.isdir(filename), os.path.isdir(dir_name))

# 判断某个路径是否存在 exists
print(os.path.exists(filename))
print(os.path.exists('1111'))

# 如果不存在 'code' 目录就创建,存在就不创建

if not os.path.isdir(dir_name):
    os.mkdir(dir_name)

if not os.path.exists(dir_name):
    os.mkdir(dir_name)

绝对与相对路径 ​

image-20231116234617892

案例:遍历文件 ​

新建一个目录,目录结果如下

└─code02
    │  readme.py
    ├─java
    │      aaa.java
    └─python
        │  aaa.py
        │  bbb.py
        └─day1
                hello.py

需求:遍历当前目录下所有的文件

python
import os

# os.listdir 列出当前目录下所有的名字
path_list = os.listdir('.')
print(path_list)
for path in path_list:
    if os.path.isfile(path):
        print('文件:', path)
    elif os.path.isdir(path):
        print('目录:', path)
        # 目录的话 继续遍历
        path2_list = os.listdir(path)
        for path2 in path2_list:
            full_path2 = os.path.join(path, path2)
            # print('path2', path2)
            # print('full_path2', full_path2)
            # path2 java  --> code/java
            # path2 python --> code/python
            if os.path.isfile(full_path2):
                print('文件:', full_path2)
            elif os.path.isdir(full_path2):
                print('目录:', full_path2)
                # 继续遍历
                path3_list = os.listdir(full_path2)
                for path3 in path3_list:
                    full_path3 = os.path.join(path, path2, path3)
                    if os.path.isfile(full_path3):
                        print('文件:', full_path3)
                    elif os.path.isdir(full_path3):
                        print('目录:', full_path3)