详谈Python3 操作系统与路径 模块(os / os.path / pathlib)


Posted in Python onApril 26, 2018

以下代码以Python3.6.1 / windows10为例

Less is more!

#!/usr/bin/env python
# coding=utf-8
__author__ = 'Luzhuo'
__date__ = '2017/5/7'
import os
def os_demo():
 # 执行命令
 dirs = os.popen("dir").read()
 print(dirs)
 # 打印目录树
 dirs_info = os.scandir()
 for info in dirs_info:
  print("文件名: {}, 路径: {}, inode: {}, 文件夹? {}, 文件? {}, 链接? {}".format(info.name, info.path, info.inode(), info.is_dir(), info.is_file(), info.is_symlink()))
  stats = info.stat()
  print(">>> 访问时间: {}, 修改时间: {}, 模式修改时间: {}, 大小: {}".format(stats.st_atime, stats.st_ctime, stats.st_mtime, stats.st_size))

import signal

def os_func():
 '''
 操作系统模块
  该模块下的方法,对各个版本的兼容不明确,须谨慎使用.
  测试版本: Python:3.6.1 Windows:Windows10,64bit
 '''
 # === 系统 ===
 strs = os.name # 当前系统: Linux'posix' / Windows'nt' / 'ce' / 'java'
 strs = os.sep # 分隔符 \\ (windows:\\ linux:/)
 strs = os.pathsep # path变量分隔符 ; (windows:; linux::)
 strs = os.linesep # 换行分隔符 \r\n (windows:/r/n linux:\n)
 dics = os.environ # 查看系统环境变量(字典)
 strs = os.getenv("Path", default=-1) # 读取环境变量, 没有返回None
 os.putenv("Path", "C:\\python") # 添加环境变量 (windows无效)
 os.unsetenv("Path") # 删除环境变量 (windows不可用)
 strs = os.getlogin() # 当前登录的用户名
 num = os.getpid() # 当前进程PID
 num = os.system("cmd") # 执行操作系统命令, 返回0/1(0执行正确;1执行错误)
 strs = os.popen("dir").read() # 执行系统命令,并去读结果
 tups = os.times() # 当前进程时间(user用户 / system系统 / children_user子用户(windews=0) / children_system子系统(windews=0) / elapsed过去时间)
 bytes = os.urandom(10) # n字节用以加密的随机字符
 num = os.cpu_count() # CUP数量

 # === 进程 ===
 os.abort() # 结束进程
 # execl(file, *args) / execle / execlp / execlpe / execv / execve / execvp / execvpe // 运行新程序替换当前进程
 os.execl(r"C:\python", 'python', 'hello.py', 'i') # (windows执行失败)
 os._exit(0) # 退出
 os.kill(8480, signal.SIGTERM) # (系统) 终止进程(需要导入:signal) SIGINT (终止进程) / SIGTERM (终止进程) / SIGKILL (终止进程) / SIGALRM (闹钟信号)

 # === 文件 / 文件夹 ===
 strs = os.getcwd() # 当前路径
 bytes = os.getcwdb() # 当前路径
 os.chdir(r"C:\Windows") # 切换路径
 strs = os.curdir # 当前目录 .
 strs = os.pardir # 上级目录 ..
 strs = os.sep # 路径分隔符 ('/' or '\\')
 bytes = os.fsencode(r"C:\c.obj") # (编码) 文件路径字符串转为bytes类型 => b'C:\\c.obj'
 strs = os.fsdecode(b"C:\c.obj") # (解码) 文件路径转为strs类型 => 'C:\\c.obj'
 # chmod(path, mode, *, dir_fd=None, follow_symlinks=True)
 os.chmod(r"C:\python\hello.py", 777) # 修改模式
 os.link("file.txt", "file.txt.link") # 创建硬链接
 os.symlink("file.txt", "file.txt.link") # 创建软链接 (windows执行失败)
 lists = os.listdir() # 所有文件和文件夹(列表) ".""..""D:"
 # lstat(path, *, dir_fd=None)
 tups = os.lstat(r"C:\c.obj") # 状态信息列表
 boolean = os.access(r"C:\c.obj", os.F_OK) # (文件/文件夹) 权限测试 (mode: F_OK存在? / R_OK可读? / W_OK可写? / X_OK可执行?)
 # scandir(path='.') // DirEntry迭代器, 文件目录
 lists = os.scandir()
 # st_atime (访问时间) / st_ctime (修改时间) / st_mtime (模式修改时间) / st_size (大小(字节bytes))
 # st_uid (用户ID) / st_gid (用户组ID)
 # st_ino (inode) / st_mode (模式) / st_dev (设备) / st_nlink (硬链接)
 # count = cpu_count() # (系统) CPU线程数(非核数)
 tups = os.stat(".") # 获取状态信息, 返回stat_result对象
 # utime(path, times=None, *, ns=None, dir_fd=None, follow_symlinks=True) // 更新文件的访问和修改时间
 num = os.utime(r"C:\c.obj")
 # walk(top, topdown=True, onerror=None, followlinks=False) // 根目录(top)遍历目录树,返回迭代器 (dirpath, dirnames[], filenames[]).
 root, dirnames, filenames = os.walk(r"C:\python")
 os.removedirs(r"c:\python") # 删除多个文件夹 (windews删除多个文件夹失败,单个成功)
 # mkdir(path, mode=0o777, *, dir_fd=None) // 创建单个目录, 文件夹已存在,抛 FileExistsError 异常
 os.mkdir("test")
 # makedirs(name, mode=0o777, exist_ok=False) // 创建(多个)文件夹
 os.makedirs(r"./t1/t2/t3")
 os.rmdir("test") # 删除单个目录
 # mknod(path, mode=0o600, device=0, *, dir_fd=None) // 创建空文件 (windows不可用)
 os.mknod("test.txt")
 # remove(path, *, dir_fd=None)
 os.remove("test.txt") # 删除文件
 # rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
 os.rename("text.txt", "file.txt") # 重命名
 os.renames("text.txt", "file.txt")
 # replace(src, dst, *, src_dir_fd=None, dst_dir_fd=None) // 重命名, 存在则替换
 os.replace("text.txt", "file.txt")
 tups = os.stat(r"text.txt") # 文件属性

 # === 文件读写 ===
 # open(path, flags, mode=0o777, *, dir_fd=None) // 打开文件 fd:文件描述符
 fd = os.open(r"C:\c.obj", os.O_RDWR | os.O_CREAT)
 readfd, writefd = os.pipe() # 打开管道,返回读取,写入 (windows失败)
 # fdopen(fd, *args, **kwargs) // 打开 (windews写入失败,读取""字符)
 f = os.fdopen(readfd)
 os.read(fd, 150) # 读取
 os.write(fd, "String".encode("utf-8")) # 写入
 os.fsync(fd) # 强行写入
 os.ftruncate(fd, 100) # 裁剪文件
 bytes = os.lseek(fd, 10, os.SEEK_SET) # 设置指针 SEEK_SET(0开始) SEEK_CUR(1当前位置) SEEK_END(2末尾)
 fd_temp = os.dup(fd) # 副本
 boolean = os.isatty(fd) # 是否是tty设备
 stat = os.fstat(fd) # 状态信息
 strs = os.device_encoding(fd) # 返回终端字符编码,非终端None
 os.close(fd) # 关闭
 os.closerange(fd, fd) # 关闭并忽略错误

 # === DirEntry ===
 for dir in os.scandir():
  strs = dir.name # 文件名
  strs = dir.path # 完整路径名
  num = dir.inode() # inode编号
  boolean = dir.is_dir() # 是否是文件夹
  boolean = dir.is_file() # 是否是文件
  boolean = dir.is_symlink() # 是否是链接
  tups = dir.stat() # 状态信息的stat_result对象
# ======================================================================


def path_demo():
 path = os.getcwd() # 获取当前目录
 print("路径: {}".format(path))
 dirname = os.path.dirname(path) # 获取文件夹名
 print("文件夹名为: {}".format(dirname))
 drive, path_t = os.path.splitdrive(path) # 获取盘符
 print("盘符为: {}".format(drive))


def path_func():
 '''
 操作路径的函数
 '''
 paths = [r'file.txt', r"/python/lib/hello.py", r"/python/local/text.txt", "C:/python/local", "C:/python/file.txt"]
 strs = os.path.abspath(paths[0]) # 绝对路径
 strs = os.path.basename(paths[1]) # 文件名
 strs = os.path.dirname(paths[1]) # 文件夹名
 strs = os.path.join("C:\\", r"a.txt") # 将路径组合返回
 dirname, filename = os.path.split(paths[1]) # 分割路径 (目录 文件名)
 strs, text = os.path.splitext(paths[1]) # 分离扩展名 (前部分, 扩展名)
 drivename, pathname = os.path.splitdrive(paths[3]) # 分离目录 (盘符, 目录)
 size = os.path.getsize(paths[0]) # 文件大小
 strs = os.path.normcase(paths[1]) # 规范大小写 (修改斜杠)
 strs = os.path.normpath(paths[1]) # 规范斜杠 (修改斜杠)
 strs = os.path.realpath(paths[1]) # 规范名字 (全名)
 # relpath(paths[0], start=os.curdir)
 strs = os.path.relpath(paths[1]) # 当前路径的文件相对路径 => 'lib\\hello.py'
 boolean = os.path.exists(paths[1]) # 路径是否存在
 boolean = os.path.isabs(paths[1]) # 是否是绝对路径 (不准)
 boolean = os.path.isfile(paths[1]) # 是否是文件
 boolean = os.path.isdir(paths[1]) # 是否是文件夹
 boolean = os.path.islink(paths[1]) # 是否是软链接
 boolean = os.path.ismount("C:\\") # 是否是根结点
 boolean = os.path.supports_unicode_filenames # Unicode是否可用作文件名
 boolean = os.path.samefile(paths[0], paths[0]) # 是否指向同文件或目录
 boolean = os.path.sameopenfile(os.open(paths[0], 1), os.open(paths[0], 1)) # fd是否指向同一文件
 boolean = os.path.samestat(os.stat(paths[0]), os.stat(paths[0])) # state是否指向同一文件
 time_s = os.path.getatime(paths[0]) # 获取访问时间
 time_s = os.path.getmtime(paths[0]) # 获取修改时间
 time_s = os.path.getctime(paths[0]) # 元数据修改时间
# ===================================================================================================

import pathlib
def pathlib_demo():
 path = pathlib.Path().home() / "python"
 path_iter = path.iterdir() # 遍历目录
 for path in path_iter:
  file_bool = path.is_file
  if not file_bool:
   continue
  print(">>> {}".format(path))
  f = path.open() # 是文件就打开读点内容
  data = f.readline()
  print(data)
  f.close()

def pathlib_func():
 '''
 适合于不同操作系统的类来对文件系统路径进行操作
 '''
 # === PurePath (纯路径) ===
 # PurePath(*pathsegments) // 系统地灵分割
 path_pure = pathlib.PurePath('hello.py')
 path_pure = pathlib.PurePath('python', 'hello.py')
 path_pure = pathlib.PurePath(pathlib.Path('python'), pathlib.Path('hello.py'))
 # PurePosixPath(*pathsegments) // 非windows文件系统路径
 # PureWindowsPath(*pathsegments) // windows文件系统路径
 # 路径是不可变哈希的, 同风格的路径是比较有序的
 pathlib.PurePosixPath('hello') == pathlib.PurePosixPath('Hello') # => Flase (PurePosixPath分大小写)
 pathlib.PureWindowsPath('hello') == pathlib.PureWindowsPath('hello') # => True (PureWindowsPath不分大小写)
 pathlib.PureWindowsPath('hello') in {pathlib.PureWindowsPath('Hello')} # => True
 pathlib.PureWindowsPath('C:') < pathlib.PureWindowsPath('d:') # => True
 # 不同风格的路径不能比较有序
 pathlib.PureWindowsPath('hello') == pathlib.PurePosixPath('hello') # => False
 # pathlib.PureWindowsPath('hello') < pathlib.PurePosixPath('hello')
 # 运算符
 path_pure = pathlib.PurePath('c:/')
 path_pure = path_pure / 'python' / 'hello.py' # 拼接路径
 tups = path_pure.parts # 返回组件元组 => ('c:\\', 'python', 'hello.py')
 drive = path_pure.drive # 盘符 => 'c:'
 root = path_pure.root # 根目录 => '\\'
 driroot = path_pure.anchor # 盘符 + 根目录 => 'c:\\'
 parents = path_pure.parents # 父路径列表 parents[0] => PureWindowsPath('c:/python')
 parent = path_pure.parent # 父路径 => PureWindowsPath('c:/python')
 name = path_pure.name # 文件(夹)名
 suffix = path_pure.suffix # 扩展名
 suffixs = path_pure.suffixes # 扩展名列表
 name = path_pure.stem # 不带后缀名的文件(夹)名 => 'hello'
 path = path_pure.as_posix() # 以/返回路径
 path = path_pure.as_uri() # 以file URL方式返回路径, 必须是绝对路径 => 'file:///c:/python/hello.py'
 path = path_pure.joinpath("a.txt", "b.txt") # 拼接路径 => PureWindowsPath('c:/python/hello.py/a.txt/b.txt')
 path = path_pure.with_name("world.py") # 更改路径文件(夹)名 => PureWindowsPath('c:/python/world.py')
 path = path_pure.with_suffix(".txt") # 更改扩展名,没有则添加
 boolean = path_pure.match("*.py") # 匹配通配符 (从右侧进行匹配) (大小写的区分见上方比较代码)
 boolean = path_pure.is_absolute() # 是否是绝对路径 (/ // c:/ 开头都被认为是绝对路径)


 # === Path (具体路径) ===
 # Path(*pathsegments)
 path = pathlib.Path('hello.py')
 # PosixPath(*pathsegments)
 # WindowsPath(*pathsegments)
 path_s = path.cwd() # 当前路径
 home = path.home() # 用户主目录
 state = path.stat() # 该路径的状态信息 同os.stat()
 state = path.lstat() # 同stat(), 目标是软链接将返回软链接信息
 path.chmod(777) # 修改权限模式 同os.chmod()
 path.lchmod(777) # 同chmod(), 目标是软链接将更改软链接模式
 lists = path.glob(r'*.py') # 迭代器, 所有py文件 (windows失效)
 group = path.group() # 文件的组 (windows不可用)
 iter = path.iterdir() # 遍历目录 (必须是目录)
 # mkdir(mode=0o777, parents=False, exist_ok=False)
 path.mkdir() # 创建文件夹
 path.rmdir() # 删除文件夹
 # open(mode='r', buffering=-1, encoding=None, errors=None, newline=None) // 打开文件
 f = path.open()
 bytes = path.read_bytes() # 读取文件内容
 num = path.write_bytes(b"hello") # (覆盖)写入文件内容
 # read_text(encoding=None, errors=None)
 strs = path.read_text(encoding='utf-8')
 # write_text(data, encoding=None, errors=None)
 num = path.write_text("hello")
 ow = path.owner() # 该文件拥有者 (windows不可用)
 path.rename("new.txt") # 重命名,目标存在则替换
 path.replace("new.txt") # 重命名,目标存在则替换
 path_s = path.resolve() # 绝对路径
 path.symlink_to("hello.py", target_is_directory=False) # 创建软链接, 如果目标是目录, 则(windows下)target_is_directory=True (windows失败)
 path.unlink() # 删除文件/文件软链接
 # touch(mode=0o666, exist_ok=True)
 path.touch() # 创建文件
 boolean = path.exists() # 文件(夹)是否存在
 boolean = path.is_dir() # 是否是文件夹
 boolean = path.is_file() # 是否是文件
 boolean = path.is_symlink() # 是否是硬链接
 boolean = path.is_block_device() # 是否是块设备
 boolean = path.is_char_device # 是否是字符设备
 boolean = path.samefile(path) # path是否是同一文件

if __name__ == "__main__":
 os_demo()
 path_demo()
 pathlib_demo()
 # os_func()
 # path_func()
 # pathlib_func()

以上这篇详谈Python3 操作系统与路径 模块(os / os.path / pathlib)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
详解Python中的循环语句的用法
Apr 09 Python
Python实现Youku视频批量下载功能
Mar 14 Python
Python使用openpyxl读写excel文件的方法
Jun 30 Python
Python实现在某个数组中查找一个值的算法示例
Jun 27 Python
Python wxPython库使用wx.ListBox创建列表框示例
Sep 03 Python
pyttsx3实现中文文字转语音的方法
Dec 24 Python
75条笑死人的知乎神回复,用60行代码就爬完了
May 06 Python
python try except返回异常的信息字符串代码实例
Aug 15 Python
python list转置和前后反转的例子
Aug 26 Python
pytorch中的上采样以及各种反操作,求逆操作详解
Jan 03 Python
python 元组的使用方法
Jun 09 Python
详解Selenium 元素定位和WebDriver常用方法
Dec 04 Python
python3中获取文件当前绝对路径的两种方法
Apr 26 #Python
python获取当前目录路径和上级路径的实例
Apr 26 #Python
python 删除非空文件夹的实例
Apr 26 #Python
Python3.5 创建文件的简单实例
Apr 26 #Python
对Python 文件夹遍历和文件查找的实例讲解
Apr 26 #Python
Python3.遍历某文件夹提取特定文件名的实例
Apr 26 #Python
Python实现按当前日期(年、月、日)创建多级目录的方法
Apr 26 #Python
You might like
PHP脚本的10个技巧(5)
2006/10/09 PHP
xml在joomla表单中的应用详解分享
2012/07/19 PHP
基于php设计模式中工厂模式详细介绍
2013/05/15 PHP
简单的cookie计数器实现源码
2013/06/07 PHP
浅谈web上存漏洞及原理分析、防范方法(安全文件上存方法)
2013/06/29 PHP
在Linux系统的服务器上隐藏PHP版本号的方法
2015/06/06 PHP
javascript事件模型代码
2007/07/01 Javascript
js如何设置在iframe框架中指定div不显示
2013/12/04 Javascript
使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解
2017/07/24 Javascript
React Native仿美团下拉菜单的实例代码
2017/08/08 Javascript
Angular4绑定html内容出现警告的处理方法
2017/11/03 Javascript
jquery 获取索引值在一定范围的列表方法
2018/01/25 jQuery
使用layer弹窗和layui表单实现新增功能
2018/08/09 Javascript
vue组件中iview的modal组件爬坑问题之modal的显示与否应该是使用v-show
2019/04/12 Javascript
JavaScript实现简单的计算器
2020/01/16 Javascript
使用next.js开发网址缩短服务的方法
2020/06/17 Javascript
Vue(定时器)解决mounted不能获取到data中的数据问题
2020/07/30 Javascript
python自动化工具日志查询分析脚本代码实现
2013/11/26 Python
使用Python写个小监控
2016/01/27 Python
Python实现的堆排序算法示例
2018/04/29 Python
Python 虚拟空间的使用代码详解
2019/06/10 Python
对Python中TKinter模块中的Label组件实例详解
2019/06/14 Python
pytorch GAN伪造手写体mnist数据集方式
2020/01/10 Python
Html5上传图片 移动端、PC端通用代码
2016/06/08 HTML / CSS
哈萨克斯坦最大的时装、鞋子和配饰在线商店:Lamoda.kz
2019/11/19 全球购物
捷克家具销售网站:SCONTO Nábytek
2020/01/02 全球购物
优秀共产党员先进事迹材料
2014/05/06 职场文书
奥巴马就职演讲稿
2014/05/15 职场文书
2014国庆节餐厅促销活动策划方案
2014/09/16 职场文书
勤俭节约倡议书范文
2015/04/29 职场文书
感恩老师主题班会
2015/08/12 职场文书
聘任通知书
2015/09/21 职场文书
MySQL 表空间碎片的概念及相关问题解决
2021/05/07 MySQL
如何利用Matlab制作一款真正的拼图小游戏
2021/05/11 Python
详解CSS故障艺术
2021/05/25 HTML / CSS
VUE使用draggable实现组件拖拽
2022/04/06 Vue.js