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)
绝对与相对路径
案例:遍历文件
新建一个目录,目录结果如下
└─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)