python_os模块

Table of Contents

OS模块

  • 该模块提供了一些方便使用操作系统相关功能的函数。
  • 想读写一个文件,open(),
  • 操作路径, os.path
1
2
import os
import re

os.name

  • 该属性宽泛地指明了当前 Python 运行所在的环境,实际上是导入的操作系统相关模块的名称。这个名称也决定了模块中哪些功能是可用的,哪些是没有相应实现的。
  • 目前有效名称为以下三个:posix,nt,java。
1
os.name

Output:
‘nt’

os.sep

  • 主要用于系统路径的分隔符:
  • Windows系统通过是 \,Linux类系统如Ubuntu的分隔符是 /
1
os.sep

Output:

'\\'

os.path.dirname(ph)

  1. 语法:os.path.dirname(path)
  2. 功能:去掉文件名,返回目录
1
2
os.path.dirname(r'd:\software')

Output:
‘d:\‘

os.path.basename(ph)

  1. 语法:os.path.basename(path)
  2. 功能:返回path最后的文件名
1
2
os.path.basename(r'd:\software')

Output:
‘software’

os.pardir

  1. 语法
  2. 参数:无。
  3. 返回值:返回当前目录的父目录(上一级目录),默认值为 ..
1
2
3
4
os.pardir
os.getcwd()
os.path.abspath(os.path.join(os.getcwd(), os.pardir))

Output:
‘..’

Output:

'd:\\'

Output:
‘d:\‘

os.environ

  • os.environ属性可以返回环境相关的信息,主要是各类环境变量。返回值是一个映射(类似字典类型),具体的值为第一次导入os模块时的快照;其中的各个键值对,键是环境变量名,值则是环境变量对应的值。在第一次导入os模块之后,除非直接修改os.environ的值,否则该属性的值不再发生变化。
1
2
3
os.environ['HOMEPATH']

os.environ

Output:
‘\Users\xiaoyx’

Output:
environ{‘ALLUSERSPROFILE’: ‘C:\ProgramData’,
‘APPDATA’: ‘C:\Users\xiaoyx\AppData\Roaming’,
‘APPLICATION_INSIGHTS_NO_DIAGNOSTIC_CHANNEL’: ‘1’,
‘CHOCOLATEYINSTALL’: ‘C:\ProgramData\chocolatey’,
‘CHOCOLATEYLASTPATHUPDATE’: ‘133302881561848781’,
‘CHROME_CRASHPAD_PIPE_NAME’: ‘\\.\pipe\crashpad_26876_GMWMILBKGJTUSXKS’,
‘COMMONPROGRAMFILES’: ‘C:\Program Files\Common Files’,
‘COMMONPROGRAMFILES(X86)’: ‘C:\Program Files (x86)\Common Files’,
‘COMMONPROGRAMW6432’: ‘C:\Program Files\Common Files’,

os.getcwd()

  • 返回当前工作目录
1
os.getcwd()

Output:
‘d:\‘

os.chdir()

  • “chdir”其实是“change the directory”的简写,因此 os.chdir()的用处实际上是切换当前工作路径为指定路径。其中“指定路径”需要作为参数传入函数 os.chdir(),该参数既可以是文本或字节型字符串,也可以是一个文件描述符,还可以是一个广义的类路径(path-like)对象。若指定路径不存在,则会抛出FileNotFoundError异常。
1
2
os.chdir('d:\\')
os.getcwd()

Output:
Output:
‘d:\‘

os.getlogin()

  • 返回当前系统的实际登录名
1
os.getlogin()

Output:
‘xiaoyx’

os.walk(ph)

  • 这个函数需要传入一个路径作为top参数,函数的作用是在以top为根节点的目录树中游走,对树中的每个目录生成一个由(dirpath, dirnames, filenames)三项组成的三元组。
  • os.walk(top, topdown=True, onerror=None, followlinks=False)
  • 得到的是一个生成器
    • 第一层:目录路径
    • 第二层:目录名
    • 第三层:目录下的文件名
1
2
# 得到的是一个生成器
os.walk(".\\")

Output:
<generator object _walk at 0x0000017805566FF0>

1
2
3
4
5
6
7
8
9
10
11
12
13
ph = "D:\\BLOG\\yxhsiao\\themes\\next\\docs"

# 用for循环
for path, dirs, files in os.walk(ph):
for name in files:
print(os.path.join(path, name))

# 列表推导式:
[
os.path.join(path, file) for path, dir, files in os.walk(ph)
for file in files if re.search(r'\.\w+$', file)
]

Output:
D:\BLOG\yxhsiao\themes\next\docs\AGPL3.md
D:\BLOG\yxhsiao\themes\next\docs\AUTHORS.md
D:\BLOG\yxhsiao\themes\next\docs\LICENSE.txt
D:\BLOG\yxhsiao\themes\next\docs\ru\README.md
D:\BLOG\yxhsiao\themes\next\docs\zh-CN\CODE_OF_CONDUCT.md
D:\BLOG\yxhsiao\themes\next\docs\zh-CN\CONTRIBUTING.md
D:\BLOG\yxhsiao\themes\next\docs\zh-CN\README.md

Output:

['D:\\BLOG\\yxhsiao\\themes\\next\\docs\\AGPL3.md',
 'D:\\BLOG\\yxhsiao\\themes\\next\\docs\\AUTHORS.md',
 'D:\\BLOG\\yxhsiao\\themes\\next\\docs\\LICENSE.txt',
 'D:\\BLOG\\yxhsiao\\themes\\next\\docs\\ru\\README.md',
 'D:\\BLOG\\yxhsiao\\themes\\next\\docs\\zh-CN\\CODE_OF_CONDUCT.md',
 'D:\\BLOG\\yxhsiao\\themes\\next\\docs\\zh-CN\\CONTRIBUTING.md',
 'D:\\BLOG\\yxhsiao\\themes\\next\\docs\\zh-CN\\README.md']
1
2
3
4
5
6
7
8
9
10
ph = "D:\\BLOG\\yxhsiao\\themes\\next\\docs"
# 获取所有目录
[ph for ph, dir, files in os.walk(ph)]

# 获取子目录
[os.path.join(ph,x) for ph, dir, files in os.walk(ph) for x in dir]

# 获取所有文件
[os.path.join(ph, file) for ph, dir, files in os.walk(ph) for file in files]

Output:
[‘D:\BLOG\yxhsiao\themes\next\docs’,
‘D:\BLOG\yxhsiao\themes\next\docs\ru’,
‘D:\BLOG\yxhsiao\themes\next\docs\zh-CN’]

Output:

['D:\\BLOG\\yxhsiao\\themes\\next\\docs\\ru',
 'D:\\BLOG\\yxhsiao\\themes\\next\\docs\\zh-CN']

Output:

['D:\\BLOG\\yxhsiao\\themes\\next\\docs\\AGPL3.md',
 'D:\\BLOG\\yxhsiao\\themes\\next\\docs\\AUTHORS.md',
 'D:\\BLOG\\yxhsiao\\themes\\next\\docs\\LICENSE.txt',
 'D:\\BLOG\\yxhsiao\\themes\\next\\docs\\ru\\README.md',
 'D:\\BLOG\\yxhsiao\\themes\\next\\docs\\zh-CN\\CODE_OF_CONDUCT.md',
 'D:\\BLOG\\yxhsiao\\themes\\next\\docs\\zh-CN\\CONTRIBUTING.md',
 'D:\\BLOG\\yxhsiao\\themes\\next\\docs\\zh-CN\\README.md']
1
2
3
4
5
6
7
8
9
10
11
# 既然生成器的结果是一个二维列表,那么就可以用list[0],list[1],list[2]分别获取其路径、目录名、文件
# list[0]:路径
# list[1]:目录名列表
# list[2]:文件列表

[i[0] for i in os.walk(ph)]
[i[1] for i in os.walk(ph)]
[i[2] for i in os.walk(ph)]

[os.path.join(i[0],x) for i in os.walk(ph) for x in i[2]]

Output:

['D:\\BLOG\\yxhsiao\\themes\\next\\docs',
 'D:\\BLOG\\yxhsiao\\themes\\next\\docs\\ru',
 'D:\\BLOG\\yxhsiao\\themes\\next\\docs\\zh-CN']

Output:

[['ru', 'zh-CN'], [], []]

Output:
[[‘AGPL3.md’, ‘AUTHORS.md’, ‘LICENSE.txt’],
[‘README.md’],
[‘CODE_OF_CONDUCT.md’, ‘CONTRIBUTING.md’, ‘README.md’]]

Output:
[‘D:\BLOG\yxhsiao\themes\next\docs\AGPL3.md’,
‘D:\BLOG\yxhsiao\themes\next\docs\AUTHORS.md’,
‘D:\BLOG\yxhsiao\themes\next\docs\LICENSE.txt’,
‘D:\BLOG\yxhsiao\themes\next\docs\ru\README.md’,
‘D:\BLOG\yxhsiao\themes\next\docs\zh-CN\CODE_OF_CONDUCT.md’,
‘D:\BLOG\yxhsiao\themes\next\docs\zh-CN\CONTRIBUTING.md’,
‘D:\BLOG\yxhsiao\themes\next\docs\zh-CN\README.md’]

os.scandir(ph)

  1. 返回path目录树中对应的os.DirEntry对象的迭代器(文件夹或文件),
  2. 不包含子文件夹里的文件夹和文件,
  3. 运行效率比os.walk高,Python官方推荐使用os.scandir来遍历目录树。
1
2
3
4
5
6
7
8
9
10
def find_dir(ph):
return [i.path for i in os.scandir(ph) if i.is_dir()]


def find_file(ph):
return [i.path for i in os.scandir(ph) if i.is_file()]


find_dir(ph)
find_file(ph)

Output:
[‘D:\BLOG\yxhsiao\themes\next\docs\ru’,
‘D:\BLOG\yxhsiao\themes\next\docs\zh-CN’]
Output:
[‘D:\BLOG\yxhsiao\themes\next\docs\AGPL3.md’,
‘D:\BLOG\yxhsiao\themes\next\docs\AUTHORS.md’,
‘D:\BLOG\yxhsiao\themes\next\docs\LICENSE.txt’]

os.listdir()

  • 列出(当前)目录下的全部路径(及文件)。
  • 该函数存在一个参数,用以指定要列出子目录的路径,默认为“.”,即“当前路径”。
  • 函数返回值是一个列表,其中各元素均为字符串,分别是各路径名和文件名。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 不指定路径的情况下默认当前目录
ph = r"D:\BLOG\yxhsiao\themes\next\docs"


def find_dir(ph):
return [i for i in os.listdir(ph) if re.search(r'\.\w+$', i) == None]


def find_file(ph):
return [i for i in os.listdir(ph) if re.search(r'\.\w+$', i)]


find_dir(ph)
find_file(ph)

Output:

['ru', 'zh-CN']

['AGPL3.md', 'AUTHORS.md', 'LICENSE.txt']

os.mkdir()

  • 新建一个目录。需要传入一个类路径参数用以指定新建路径的位置和名称,
  • 如果指定路径已存在,则会抛出FileExistsError异常。
  • 该函数只能在已有的路径下新建一级路径,新建多级路径会抛出FileNotFoundError异常。
  • 需要新建多级路径的场景下,使用 os.makedirs()来完成任务。函数 os.makedirs()执行的是递归创建,若有必要,会分别新建指定路径经过的中间路径,直到最后创建出末端的“叶子路径”。
1
2
3
4
5
6
7
dir = 'D:\\OneDrive\\Code\\Note\\python_module'
[i for i in os.listdir(dir)]

newdir = os.path.join(dir, 'test_makedir')

os.rmdir(newdir) if os.path.exists(newdir) else os.mkdir(newdir)
[i for i in os.listdir(dir)]

Output:
[‘.ipynb_checkpoints’,
‘Datetime’,
‘Numpy’,
‘Openpyxl_处理Excel’,
‘Os’,
‘Pandas’,
‘Pillow’,
‘pychart’,
‘Random’,
‘Regex’,
‘Sys’,
‘xlwings’,
‘Yagmail’]

Output:
[‘.ipynb_checkpoints’,
‘Datetime’,
‘Numpy’,
‘Openpyxl_处理Excel’,
‘Os’,
‘Pandas’,
‘Pillow’,
‘pychart’,
‘Random’,
‘Regex’,
‘Sys’,
‘test_makedir’,
‘xlwings’,
‘Yagmail’]

os.makedirs()

  • 同时创建多级目录

os.remove()

  • 用于删除文件。
  • 如果指定路径是目录而非文件的话,就会抛出IsADirectoryError异常。删除目录应该使用 os.rmdir()函数。

os.rmdir()

  • 删除单级目录

os.removedirs()

  • 删除多级目录

os.rename()os.renames()

  • 该函数的作用是将文件或路径重命名
  • os.rename(src, dst),即将src指向的文件或路径重命名为dst指定的名称。
  • 注意,如果指定的目标路径在其他目录下,该函数还可实现文件或路径的“剪切并粘贴”功能。但无论直接原地重命名还是“剪切粘贴”,中间路径都必须要存在,否则就会抛出FileNotFoundError异常。如果目标路径已存在,Windows 下会抛出FileExistsError异常;Linux 下,如果目标路径为空且用户权限允许,则会静默覆盖原路径,否则抛出OSError异常,
  • 和上两个函数一样,该函数也有对应的递归版本 os.renames(),能够创建缺失的中间路径。
  • 注意,这两种情况下,如果函数执行成功,都会调用 os.removedir()函数来递归删除源路径的最下级目录。

os.path

  • 其实这个模块是os模块根据系统类型从另一个模块导入的,并非直接由os模块实现,比如 os.name值为nt,则在os模块中执行 import ntpath as path;如果 os.name值为posix,则导入posixpath。
  • 使用该模块要注意一个很重要的特性:os.path中的函数基本上是纯粹的字符串操作。换句话说,传入该模块函数的参数甚至不需要是一个有效路径,该模块也不会试图访问这个路径,而仅仅是按照“路径”的通用格式对字符串进行处理。
  • 更进一步地说,os.path模块的功能我们都可以自己使用字符串操作手动实现,该模块的作用是让我们在实现相同功能的时候不必考虑具体的系统,尤其是不需要过多关注文件系统分隔符的问题。
1
os.path

Output:
<module ‘ntpath’ from ‘c:\Users\xiaoyx\AppData\Local\Programs\Python\Python310\lib\ntpath.py’>

os.path.join()

  • 可以将多个传入路径组合为一个路径。实际上是将传入的几个字符串用系统的分隔符连接起来,组合成一个新的字符串,所以一般的用法是将第一个参数作为父目录,之后每一个参数即使下一级目录,从而组合成一个新的符合逻辑的路径。
  • 但如果传入路径中存在一个“绝对路径”格式的字符串,且这个字符串不是函数的第一个参数,那么其他在这个参数之前的所有参数都会被丢弃,余下的参数再进行组合。更准确地说,只有最后一个“绝对路径”及其之后的参数才会体现在返回结果中。
1
2
3
4
5
6
7
p1 = 'home'
p2 = 'fm'
p3 = 'note'

# 按照传入参数的顺序连接,并且用系统分隔符隔开
os.path.join(p1, p2, p3)
os.path.join(p3, p2, p1)

Output:
‘home\fm\note’
‘note\fm\home’

os.path.abspath()

  • 将传入路径规范化,返回一个相应的绝对路径格式的字符串。
  • 也就是说当传入路径符合“绝对路径”的格式时,该函数仅仅将路径分隔符替换为适应当前系统的字符,不做其他任何操作,并将结果返回。所谓“绝对路径的格式”,其实指的就是一个字母加冒号,之后跟分隔符和字符串序列的格式:
1
2
3
4
5
6
7
8
# 当前目录的绝对路径
os.path.abspath(r".")

# 上级目录的绝对路径
os.path.abspath(r"..")

# 指定目录
os.path.abspath(r"D:\BLOG\yxhsiao\themes\next\docs")

Output:
‘d:\‘
‘d:\‘
‘D:\BLOG\yxhsiao\themes\next\docs’

os.path.basename()

  • 该函数返回传入路径的“基名”,即传入路径的最下级目录。
  • 整这个函数要注意的一点是,返回的“基名”实际上是传入路径最后一个分隔符之后的子字符串,也就是说,如果最下级目录之后还有一个分隔符,得到的就会是一个空字符串:
1
os.path.basename(r'D:\OneDrive\SOFT\FormatFactory')

Output:
‘FormatFactory’

os.path.dirname()

  • os.path.basename()函数正好相反,返回的是最后一个分隔符前的整个字符串:
1
os.path.dirname(r'D:\OneDrive\SOFT\FormatFactory')

Output:
‘D:\OneDrive\SOFT’

os.path.split()

  • 实际上前两个函数都是弟弟,这个函数才是老大。
  • 函数 os.path.split()的功能就是将传入路径以最后一个分隔符为界,分成两个字符串,并打包成元组的形式返回.
  • 前两个函数 os.path.dirname()os.path.basename()的返回值分别是函数 os.path.split()返回值的第一个、第二个元素。就连二者的具体实现都十分真实:
1
os.path.split(r'D:\OneDrive\SOFT\FormatFactory')

Output:
(‘D:\OneDrive\SOFT’, ‘FormatFactory’)

os.path.splitex()

  • 分离文件名与扩展名;默认返回(fname,fextension)元组,可做分片操作
1
2
ph = r"D:\3D\export\test3.pdf"
os.path.splitext(ph)

Output:
(‘D:\3D\export\test3’, ‘.pdf’)

os.path.exists()

  • 这个函数用于判断路径所指向的位置是否存在。若存在则返回True,不存在则返回False
1
os.path.exists(r'D:\OneDrive\SOFT\134')

Output:
False

os.path.isabs()

  • 该函数判断传入路径是否是绝对路径,若是则返回True,否则返回False。当然,仅仅是检测格式,同样不对其有效性进行任何核验:
1
os.path.isabs(r'D:\OneDrive\SOFT\FormatFactory')

Output:
True

os.path.isfile() 和 os.path.isdir()

  • 这两个函数分别判断传入路径是否是文件或路径,注意,此处会核验路径的有效性,如果是无效路径将会持续返回False。
1
2
3
4
a = 'D:\\OneDrive\\Code\\Note\\python_module'

os.path.isfile(a)
os.path.isdir(a)

Output:
False
True

os.path.getsize()

  • 返回指定文件的大小,以字节为单位。
  • 仅仅对文件有效。使用前最好先判断是否是文件
1
2
3
4
5
a = 'D:\\BLOG\\yxhsiao\\themes\\next\\docs\\AGPL3.md'
b = 'D:\\BLOG\\yxhsiao\\themes'

os.path.getsize(a) if os.path.isfile(a) else 'The is not file'
os.path.getsize(b) if os.path.isfile(b) else 'The is not file'

Output:
34490
‘The is not file’