os模块
文章目录
- os模块
-
- OS模块介绍
-
- 什么是OS模块
- OS模块的作用
- 环境变量是什么?
- os.environ与系统环境变量和sys.path环境变量的差异:
- 二、os系列
- 三、os.path系列
-
-
- os.path.normcase( ) 说明
- os.path.normpath( ) 说明
-
- 三、OS路径处理
-
- 1.方法1(通用)
- 2.方法二
- 四、 pathlib模块(在python3.5之后推出)
- 五、案例
OS模块介绍
什么是OS模块
- os模块是与操作系统的界面
OS模块的作用
- 该模块为python自带标准库模块
- 该函数提供了一些方便使用操作系统相关功能的函数
什么是环境变量
- 环境变量是一个总称,它是一个全球变量,对你的整个环境都有效, 它比你python文件的整体水平更高. 它指的是你整个软件的环境, 这样一个环境变量,你可以访问软件的所有地方. 此时文件没有限制, 所有文件都可以访问.
- 一般是指操作系统中指定操作系统运行环境的一些参数,如临时文件夹位置、系统文件夹位置等
- 操作系统到了这一系列的时候,就到了你的命令输入在里面吗?
os.environ与系统环境变量和sys.path环境变量的差异:
-
系统path环境变量:用于执行操作系统命令, 在寻找命令时使用操作系统, 该变量对应的值是一堆文件夹, 这些文件夹, 操作系统命令时, 会去这一系列文件夹找你输入的命令吗?.
-
sys.path环境变量:以列表的形式保存,存储一堆文件夹,在环境变量中检索文件夹
-
os.environ环境变量:是的,存储在字典中的一系列键和值, 当你想在整个环境中使用这个值时, 你可以把这个值往添加到环境变量中
二、os系列
以下是os的常用方法:
方法 | 作用 | 拓展 |
---|---|---|
输出字符串指示当前使用的平台。 | windows下为"nt",Linux下为"posix" | |
os.getcwd | 获得当前工作目录,即当前工作目录python脚本工作目录路径 | 注意: 执行文件是获取的.如果该功能被导入模块, 不是导入模块文件的目录路径。而是当前执行文件的目录路径。 |
删除文件 | - | |
重命名文件/目录 | 将新文件命名为旧文件。 旧文件必须不存在, 若是存在的文件, 抛出异常) | |
os.stat(file) | 获取文件属性或目录信息 | - |
创建目录 | 单级生存目录。 如果指定了目录的路径, 如果你想生成单级的最后一级目录,就不存在了。然后就会抛出异常。(相当于shell中的mkdir dirname) | |
多层递归目录可生成 | - | |
删除目录 | 删除单级空目录。如果目录不是空的,则不能删除。会抛出异常。(相当于shell中的rmdir dirname) | |
os.removedirs(r“c:\python”) | 如果目录为空,则删除并递归到上一级目录。如果也是空的,则删除,等等 | 多层目录的递归删除. 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 (注意: 只有为空才能删除) |
运行shell命令, 直接显示 | 应用程序将系统调用发送到操作系统。告诉操作系统操作字符串中指定的命令。 | |
os.linesep | 给出当前平台的行终止符,Windows使用 ‘\r\n’,Linux使用 ‘\n’, Mac使用 ‘\r’ | 突出当前平台使用导航终止服务。windows下为"\r\n",Linux下为"/n" (提示: 直接打印看不到任何效果。我们需要把它放在列表中. 如: [os.linesep]) |
返回指定目录下的所有文件和目录名, 包括隐藏文件和列表打印 | - | |
通过类似于深度遍历的方式,最基本的显示方式是遍历文件夹中的子文件夹和文件(root_path,[file_dirs],[files]) | - | |
os.curdir | 返回当前目录 | 以’.'符号的形式表示 |
os.chdir(‘dirname’) | 改变工作目录到’dirname’ | 相当于是shell下的cd命令 |
os.pardir | 获取当前目录的父目录字符串名:(’…’) | 以’…'符号的形式表示 |
os.sep | 取代操作系统特定的路径分隔符, win下为"", Linux下为"/" | - |
输出用于分割文件路径的字符串 win下为" ; " , Linux下为" :" | - | |
获取系统环境变量 | 注意:以字典格式存在, 其中key和value必须都为字符串类型。 |
-
import os print(os.environ) '''输出内容 environ({'ALLUSERSPROFILE': 'C:\\ProgramData', 'ANSYS180_DIR': 'F:\\ANSYS Inc\\v180\\ANSYS', 'ANSYS_SYSDIR': 'winx64', 'ANSYS_SYSDIR32': 'win32', 'ANS_OLD_ATTACH': '1', 'APPDATA': 'C:\\Users\\ThinkPad\\AppData\\Roaming', 'AWP_LOCALE180': 'en-us', 'CHOCOLATEYINSTALL': 'C:\\ProgramData\\chocolatey', 'CHOCOLATEYLASTPATHUPDATE': '132503483593518657', 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', 'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', 'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files', 'COMPUTERNAME': 'DESKTOP-GCJC73B', 'COMSPEC': 'C:\\WINDOWS\\system32\\cmd.exe', 'CONFIGSETROOT': 'C:\\WINDOWS\\ConfigSetRoot', 'DRIVERDATA': 'C:\\Windows\\System32\\Drivers\\DriverData', 'FPS_BROWSER_APP_PROFILE_STRING': 'Internet Explorer', 'FPS_BROWSER_USER_PROFILE_STRING': 'Default', 'FREI0R_PATH': 'E:\\新建文件夹\\Video Converter Studio\\frei0r;E:\\新建文件夹\\Video Converter Studio\\frei0r', 'GOPATH': 'C:\\Users\\ThinkPad\\go', 'HOMEDRIVE': 'C:', 'HOMEPATH': '\\Users\\ThinkPad', 'IC
EMCFD_SYSDIR': 'win64_amd', 'IDEA_INITIAL_DIRECTORY': 'F:\\PyCharm\\bin', 'LANG': 'chs', 'LNKEVN': 'C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe', 'LOCALAPPDATA': 'C:\\Users\\ThinkPad\\AppData\\Local', 'LOGONSERVER': '\\\\DESKTOP-GCJC73B', 'LSTC_LICENSE': 'ANSYS', 'NUMBER_OF_PROCESSORS': '8', 'ONEDRIVE': 'C:\\Users\\ThinkPad\\OneDrive', 'OS': 'Windows_NT', 'PATH': 'F:\\python_16\\venv\\Scripts;F:\\Python38\\Scripts;C:\\Program Files (x86)\\Intel\\iCLS Client\\;C:\\Program Files\\Intel\\iCLS Client\\;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\DAL;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\DAL;C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\IPT;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\IPT;C:\\Program Files\\proeWildfire 5.0\\bin;D:\\Program Files\\proeWildfire 5.0\\bin;D:\\PTC\\Proe5.0M280\\bin;C:\\WINDOWS\\System32\\OpenSSH\\;C:\\Program Files (x86)\\Common Files\\Thunder Network\\KanKan\\Codecs;C:\\Program Files\\dotnet\\;C:\\Program Files\\Pandoc\\;F:\\Go\\bin;F:\\Python38;F:\\Python27;F:\\Python27\\Scripts;C:\\ProgramData\\chocolatey\\bin;F:\\Typeeasy\\;F:\\git\\cmd;C:\\Users\\ThinkPad\\AppData\\Local\\Microsoft\\WindowsApps;;F:\\PyCharm\\bin;;C:\\Users\\ThinkPad\\go\\bin;C:\\Users\\ThinkPad\\AppData\\Roaming\\npm', 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', 'PROCESSOR_ARCHITECTURE': 'AMD64', 'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 142 Stepping 10, GenuineIntel', 'PROCESSOR_LEVEL': '6', 'PROCESSOR_REVISION': '8e0a', 'PROGRAMDATA': 'C:\\ProgramData', 'PROGRAMFILES': 'C:\\Program Files', 'PROGRAMFILES(X86)': 'C:\\Program Files (x86)', 'PROGRAMW6432': 'C:\\Program Files', 'PROMPT': '(venv) $P$G', 'PSMODULEPATH': 'C:\\Program Files\\WindowsPowerShell\\Modules;C:\\WINDOWS\\system32\\WindowsPowerShell\\v1.0\\Modules', 'PUBLIC': 'C:\\Users\\Public', 'PYCHARM': 'F:\\PyCharm\\bin;', 'PYCHARM_DISPLAY_PORT': '63342', 'PYCHARM_HOSTED': '1', 'PYTHONIOENCODING': 'UTF-8', 'PYTHONPATH': 'F:\\PyCharm\\plugins\\python\\helpers\\pycharm_matplotlib_backend;F:\\PyCharm\\plugins\\python\\helpers\\pycharm_display', 'PYTHONUNBUFFERED': '1', 'SESSIONNAME': 'Console', 'SYSTEMDRIVE': 'C:', 'SYSTEMROOT': 'C:\\WINDOWS', 'TEMP': 'C:\\Users\\ThinkPad\\AppData\\Local\\Temp', 'TMP': 'C:\\Users\\ThinkPad\\AppData\\Local\\Temp', 'UGII_BASE_DIR': 'E:\\UG_NX8.5_Win64位', 'UGII_LANG': 'simpl_chinese', 'UGII_ROOT_DIR': 'E:\\UG_NX8.5_Win64位\\UGII\\', 'UGS_LICENSE_SERVER': '28000@desktop-gcjc73b', 'USERDOMAIN': 'DESKTOP-GCJC73B', 'USERDOMAIN_ROAMINGPROFILE': 'DESKTOP-GCJC73B', 'USERNAME': 'ThinkPad', 'USERPROFILE': 'C:\\Users\\ThinkPad', 'VIRTUAL_ENV': 'F:\\python_16\\venv', 'WINDIR': 'C:\\WINDOWS', 'WXDRIVE_START_ARGS': '--wxdrive-setting=0 --disable-gpu --disable-software-rasterizer --enable-features=NetworkServiceInProcess', '_OLD_VIRTUAL_PATH': 'F:\\Python38\\Scripts;C:\\Program Files (x86)\\Intel\\iCLS Client\\;C:\\Program Files\\Intel\\iCLS Client\\;C:\\WINDOWS\\system32;C:\\WINDOWS;C:\\WINDOWS\\System32\\Wbem;C:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\DAL;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\DAL;C:\\Program Files (x86)\\Intel\\Intel(R) Management Engine Components\\IPT;C:\\Program Files\\Intel\\Intel(R) Management Engine Components\\IPT;C:\\Program Files\\proeWildfire 5.0\\bin;D:\\Program Files\\proeWildfire 5.0\\bin;D:\\PTC\\Proe5.0M280\\bin;C:\\WINDOWS\\System32\\OpenSSH\\;C:\\Program Files (x86)\\Common Files\\Thunder Network\\KanKan\\Codecs;C:\\Program Files\\dotnet\\;C:\\Program Files\\Pandoc\\;F:\\Go\\bin;F:\\Python38;F:\\Python27;F:\\Python27\\Scripts;C:\\ProgramData\\chocolatey\\bin;F:\\Typeeasy\\;F:\\git\\cmd;C:\\Users\\ThinkPad\\AppData\\Local\\Microsoft\\WindowsApps;;F:\\PyCharm\\bin;;C:\\Users\\ThinkPad\\go\\bin;C:\\Users\\ThinkPad\\AppData\\Roaming\\npm', '_OLD_VIRTUAL_PROMPT': '$P$G'}) ''' print(type(os.environ)) '''输出内容 <class 'os._Environ'> ''' # 向环境变量中设置值,取值 # 后面我们连接数据库的用户名密码,不写死到代码中,而是配置在环境变量中,使用代码获取 os.environ["username"] = "淘小欣" name = os.environ.get("username") print(name) # 淘小欣
-
os.walk()的使用
import os dir_path=os.walk("F:\python_16\day 31") print(dir_path) #<generator object walk at 0x00000208CFB77C10>(拿到的是一个生成器) 1.我们对其循环取值 for i in dir_path: print(i) '''输出内容 ('F:\\python_16\\day 31', ['test', '__pycache__'], ['app.py', 'foo.py', 'os.py', 'run.py']) ('F:\\python_16\\day 31\\test', ['a', 'c'], []) ('F:\\python_16\\day 31\\test\\a', [], ['a.py']) ('F:\\python_16\\day 31\\test\\c', [], ['c.py']) ('F:\\python_16\\day 31\\__pycache__', [], ['app.cpython-38.pyc', 'foo.cpython-38.pyc']) ''' #可以发现os.walk()以元组为单位区分每一层,每一层又分为三个部分(根目录路径, 根目录下的文件夹列表, 根目录下的文件列表) 2.我们也可以将三个部分遍历出来分开查看 for root,dirs,files in dir_path: print(root) print(dirs) print(files) print("=======》") '''输出内容 F:\python_16\day 31 ['test', '__pycache__'] ['app.py', 'foo.py', 'os.py', 'run.py'] =======》 F:\python_16\day 31\test ['a', 'c'] [] =======》 F:\python_16\day 31\test\a [] ['a.py'] =======》 F:\python_16\day 31\test\c [] ['c.py'] =======》 F:\python_16\day 31\__pycache__ [] ['app.cpython-38.pyc', 'foo.cpython-38.pyc'] =======》 ''' 3.用os.walk计算一个文件夹的大小示例 import os def dir_size(): while True: dir_path=input("请输入文件夹路径(Q\q退出)>>>:").strip() size=0 #初始化大小 if dir_path.upper()=="Q":break if not os.path.isdir(dir_path): #判断是否存在该目录 print("没有该文件夹,请重新输入") path_list=os.walk(dir_path) #得到生成器 for root,dirs,files in path_list: #遍历三个元素 for i in files: #每次遍历取出文件 size +=os.path.getsize(os.path.join(root,i)) #拼接文件路径并计算大小 print(f"该目录文件总大小为:{size}") dir_size()
三、os.path系列
os.path系列主要用于获取文件的属性, 以下是常用方法 :
方法 | 作用 |
---|---|
os.path.abspath(path) | 返回规范化的绝对路径 (多个""只识别一个) |
返回文件名 (如果传入的是路径,会切出文件名) | |
返回文件路径 (就是当前文件或目录的上一级目录) | |
如果路径 path 存在,返回 True;如果路径 path 不存在,返回 False。 | |
os.path.getatime(path) | 返回最近访问时间(浮点型, 有秒级) |
os.path.getmtime(path) | 返回最近文件修改时间 |
os.path.getctime(path) | 返回文件 path 创建时间 |
返回文件大小,如果文件不存在就返回错误 | |
os.path.isabs(path) | 判断是否为绝对路径 |
判断路径是否为文件 | |
判断路径是否为目录 | |
把目录和文件名拼接成一个路径 | |
转换path的大小写和斜杠 (只在 windows 平台上有效) | |
规范path字符串形式 | |
os.path.split(path) | 把路径分割成 dirname 和 basename,返回一个元组 |
-
os.path.normcase( ) 说明
# Linux和Mac平台上, 该函数会原样返回path, 在Windows平台上会将路径中所有字符转换为小写, 并将所有斜杠转换成反斜杠 import os res=os.path.normpath("F:/python_16///day 29\\\taoxiaoxin") print(res) #F:\python_16\day 29\ aoxiaoxin
-
os.path.normpath( ) 说明
#规范路径, 并且会识别"..", 自动将其返回上一级, 分隔符会转成当前平台使用的分隔符 import os res = os.path.normpath("F :///python_16\\ta\../xiao/") print(res) #F :\python_16\xiao res2 = os.path.normpath("F:\\python_16/ta\hai/../..") print(res2) #F:\python_16 (返回了两次)
三、OS路径处理
1.方法一(通用)
-
这种方法比较通用, Python2 和 Python3 中都适用
-
可以先使用 规范一下返回路径
import os print(os.path.abspath(__file__)) # F:\python_16\day 29\add.py BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) print(BASE_DIR) # F:\python_16(返回上一级两次) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) print(BASE_DIR) # F:\python_16(返回上一级两次) BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "../..")) print(BASE_DIR) # F:\(返回上一级三次) BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) print(BASE_DIR) # F:\(返回上一级三次)
2.方法二
-
使用比较简单
-
: 上一级
-
: 规范path字符串形式
#其中可以不使用abspath import os print(os.path.abspath(__file__)) #F:\python_16\day 29\add.py BASE_DIR = os.path.normpath(os.path.join(__file__,os.pardir,os.pardir)) print(BASE_DIR) # F:\python_16 (返回上一级两次) BASE_DIR = os.path.normpath(os.path.join(__file__,os.pardir,"..")) print(BASE_DIR) # F:\python_16 (返回上一级两次) BASE_DIR = os.path.normpath(os.path.join(__file__,"..","..","..")) print(BASE_DIR) # F:\ (返回上一级三次)
四、 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