07-06 os模块

提示: os模块是与操作系统交互的一个接口

一. os系列介绍

os.getcwd()  # 获取当前执行文件的目录路径。(注意: 获取的是执行文件.如果被导入模块中有这个功能, 并不是获得被导入模块文件的目录路径。而是获得当前执行文件的目录路径。)
os.chdir('dirname')  # 改变当前脚本工作目录。相当于是shell下的cd命令。

os.curdir  # 返回的是当前目录, 以'.'符号的形式表示
os.pardir # 返回的是上级目录。以'..'符号的形式表示

os.makedirs('dirname1/dirname2')  # 递归生成多层目录
os.removedirs('dirname')  # 递归删除多层目录. 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 (注意: 只有为空的才能删)
"""
拓展: linux系统的命令rm -r /dirname 如果你这个文件夹下面是非空的,那么就不会删除。如果想强制删除,要在后面加一个f, 这个时候加了f以后的删除就是递归强制删除。
强调: 以后就当rm没有,这是一个非常非常,非常危险的命令

替代rm的方案: 即便有一个东西要删,也不要用它去删。用mv去删除, 把需要删除的东西移动到tmp临时文件夹去删.

Windows中的真正意义上的删除:
	1. shift + del 
	2. 把东西丢到回收站。然后在回收站里再进行删除。
"""

os.mkdir('dirname')  # 生存单级目录。注意: 如果指定了目录的路径, 你想要生成单级的上一级目录不存在。那么将会抛出异常。(相当与shell中的mkdir dirname)
os.rmdir('dirname')  # 删除单级空目录。若目录不为空,则无法删除。会抛出异常。(相当于shell中的rmdir dirname)

os.stat('path/filename') # 获取当前文件信息或者目录信息。

os.sep # 输出操作系统特定的目录分隔符。windows下为"\",Linux下为"/"
os.linesep # 突出当前平台使用导航终止服务。windows下为"\r\n",Linux下为"/n" (提示: 直接打印看不到任何的效果,我们需要把它放到列表当中. 如: [os.linesep])
# 常用功能
os.path.sep  # 用于输出当前平台分割文件路径的字符串。Windows下为";", Linux下为":"。

os.name # 输出字符串指示当前使用的平台。windows下为"nt",Linux下为"posix"


# 常用
os.listdir('dirname') # 列出指定目录下的所有文件和子目录。包括隐藏文件, 并把这些路径保存到列表中。

os.remove() # 删除一个文件
os.rename('newname', 'oldname') # 把新文件名命名成旧文件。(注意: 旧文件一定要不存在, 如果是存在的文件, 则抛出异常)

os.system('ipconfig')  # 应用程序向操作系统发送了一个系统调用。告诉操作系统运行字符串中所指定的命令。
os.environ  # 获取系统环境变量. 以字典格式存在, 其中key和value必须都为字符串类型。 
"""
作用: 如果在执行文件中,产生了一个结果,这个结果不仅仅是本文件所需要要用, 你软件运行的整个环境,其他文件中都要运用到这个结果, 这个时候就是它存在的意义。

什么是环境变量?
	环境变量是一个统称. 环境变量是一个全局性的变量, 全局到你整个环境都有效, 它比你python文件中的全局级别还要高. 它代指你整个软件的环境, 你软件所有的地方都能访问到的这么一个环境变量. 这个时候没有文件的限制了, 所有文件当中都能访问的到.

os.environ与系统环境变量和sys.path环境变量的区别:
	系统path环境变量: 用于执行操作系统命令, 操作系统找命令的时候用到, 这个变量对应的值是一堆文件夹, 这些文件夹, 是在操作系统运行系统命令的时候, 会到这一系列文件夹中去找你输入的命令在不在其里面.
	sys.path环境变量: 以列表的形式保存, 列表中也是一堆文件夹, 用来python找模块的时候, 就会找这个变量里面的文件夹.
	os.environ环境变量: 它的值是一个字典格式, 其中key和value必须都是字符串类型(规定). 可以字典的操作方法进行操作. 当你往这个环境变量里面加了一组key:value,当你在你程序的某一个位置做了这件事儿以后,这意味着从当前位置作为起始,后续你程序各部分代码的运行去看这个os.environ环境变量的话, 都能看得到你之前添加的key:value. 基于这个特性如果你的程序当中运行到某一段代码的时候, 产生了一个结果,你这个结果不是只给你本文件使用的,而是想让你整个软件, 整个环境都能用的到这个值。当你想让你这个值在整个环境中都能用的到, 你就得把这个值往os.environ环境变量中添加就可以.
"""

二. os.path系列介绍

os.path.isabs(path)  # 判断是否是绝对路径。判断的依据: 在Linux系统中左斜杠'/'表示根目录。是判断的依据。在windows中,以盘符为判断依据。

os.path.abspath()  # 返回一个规范化的绝对的路径。存在的区别就是它在windows系统上才有的区别。会根据你的平台显示你的平台中路径分割符的形式。Linux中是左斜杠'/'。windows中是右斜杠'\' (目前Linux和windows中。都把这种左斜杠和右斜杠规避掉了,都可以去识别。)
print(os.path.abspath(r'Y:\\////////\\\\\\test\\\\\run.py'))  # Y:\test\run.py

os.path.split(path)  # 它会把你传的路径切分成两部分。放到一个元组中。其中第一个元素是路径,第二个是文件名。(目的: 切分文件夹和文件两部分)

os.path.getatime(path)  # 返回path所指向的文件或者目录的最后存取时间, 返回时间戳时间格式
os.path.getmtime(path)  #  返回path所指向的文件或者目录的最后修改时间, 返回时间戳时间格式

# 常用
os.path.normacase(path)  # 在Linux和Mac平台上,该函数会原样返回path。在windows平台上会将路径中所有字符转换为小写,并将所有左斜杠"/"转换为右斜杠"\"(这条命令只在windows平台上有起作用。)
print(os.path.normcase('c:/windows\\SYSTEM32\\'))  # c:\windows\system32\

os.path.normpath()  # 会识别"..", 表示给你退到上一级的操作。会识别路径分隔符, 给你转成你当前平台的路径分隔符, 并规范你的当前路径, 含有os.path.abspath的功能.
print(os.path.normpath('c://windows\\System32\\../Temp/'))  # c:\windows\Temp

os.path.dirname(path)  # 替代上面的split: 目的获取文件夹。如果你传的是文件夹的路径。你们会获取你上一个文件夹。如果传的是文件的路径。那么会获取你文件的当前的文件夹。(作用: 获取文件夹路径)
os.path.basename(path)  # 替代上面的split: 只保留你传入路径的分割符右边的内容。(作用: 获取文件名)

os.path.exist(path) # 判断它是否是一个存在的文件或者目录。
os.path.isfile(path)  # 判断它是否是一个存在的文件。不是返回True。不是返回False。
os.path.isdir(path)  # 判断它是否是一个存在的目录。

os.path.join(path1, path2, path3)  # 拼接文件路径。(Linux系统中传左斜杠"/"。左边的路径会被忽略掉。以当前左斜杠"/"为起始位置, 拼接后面的路径。在windows系统中。如果是盘符"C:",左边的路径也会被忽略掉, 以当前盘符为起始位置拼接后面的路径。)
os.path.getsize(path)  # 统计path大小。返回值为int类型(可以统计单个文件,也可以统计一个文件夹下+文件夹下包含的所有文件的大小。 注意: 文件夹也有大小)

三. os路径处理

# 方式一: 推荐使用(这种方式无论在python2还是python3中都可以使用。)
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
os.path.dirname(os.path.dirname(__file__))   # 这种虽然没有abspath规范化路径, 但是现在的操作系统的平台,针对了路径的规范化进行了优化, 已经可以识别这两种路径。, 所以不使用abspath规范化路径没有任何的影响。(abspath规范化重要的作用在于路径的识别, 如果出现多个"\\\\\\"只会识别一个, 返回"\", 这个才是abspath的比较重要的作用)

# 方式二: 不推荐使用
os.path.normpath(os.path.join(os.path.abspath(__file__, '..', '..', '..')))  # ..代表上一级
os.path.normpath(os.path.join(os.path.abspath(__file__, os.pardir, os.pardir, os.pardir)))  # os.pardir代表上一级

os.path.normpath(os.path.join(__file__, '..', '..', '..'))  # 其中可以不使用abspath

四. pathlib模块(在python3.5之后推出)

# , 推出了一个新的模块pathlib
from pathlib import Path

# 需求: 获取当前文件的父级的父级目录
res = Path(__file__).parent.parent
print(res)

# 路径拼接 + 规范化路径
res = Path('//\\a//\\\\/b/c') / 'd/e.txt'
print(res)  # \a\b\c\d\e.txt
print(type(res))  # <class 'pathlib.WindowsPath'>

# 规范化路径
print(res.resolve())   # 等同于os.path.abspath

五. 实现需求: 不利用os.path.getsize统计文件夹的大小, 利用递归实现统计整个文件下含有的所有文件大小

def search_folder_size(folder_path):
    size = 0
    if os.path.isfile(folder_path):
        return os.path.getsize(folder_path)

    for file_or_dir in os.listdir(folder_path):  # os.listdir不能判断文件, 如果是文件会抛出异常(NotADirectoryError)
        path = os.path.join(folder_path, file_or_dir)
        if os.path.isfile(path):
            size += os.path.getsize(path)
        else:
            # return search_folder_size(path)  # 注意: 这里不能加return。 # 递归一旦return 递归里面的内容,就不会继续往下走了, 从当前位置直接开始回溯,得到最终的结果 # 因为递归是在需要得到预期的结果的时候再去return, 这个return必须严格控制好(return之前, 我们要重新调用search_folder_size(path), 这个时候当它是一个文件的时候, 它的size就是一个全新的size=0, 计算完毕以后开始回溯, 回溯回来以后, 我们之前有个return这个时候就把那个size=0, 0当做结果返回了)
            search_folder_size(path)
    return size
posted @ 2020-03-30 23:20  给你加马桶唱疏通  阅读(192)  评论(0编辑  收藏  举报