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)