详谈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实现给数组按片赋值的方法
Jul 28 Python
轻量级的Web框架Flask 中模块化应用的实现
Sep 11 Python
Python制作词云的方法
Jan 03 Python
Python进程间通信Queue实例解析
Jan 25 Python
详解Python 协程的详细用法使用和例子
Jun 15 Python
python实现对指定字符串补足固定长度倍数截断输出的方法
Nov 15 Python
linux下安装python3和对应的pip环境教程详解
Jul 01 Python
tensorboard显示空白的解决
Feb 15 Python
python读取yaml文件后修改写入本地实例
Apr 27 Python
Python+logging输出到屏幕将log日志写入文件
Nov 11 Python
OpenCV+python实现膨胀和腐蚀的示例
Dec 21 Python
python math模块的基本使用教程
Jan 16 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
全国FM电台频率大全 - 9 上海市
2020/03/11 无线电
PHP命名空间(namespace)的使用基础及示例
2014/08/18 PHP
PHP使用DOM和simplexml读取xml文档的方法示例
2017/02/08 PHP
利用PHP实现开心消消乐的算法示例
2017/10/12 PHP
php实现大文件断点续传下载实例代码
2019/10/01 PHP
javascript数组的扩展实现代码集合
2008/06/01 Javascript
JQuery 学习笔记 element属性控制
2009/07/23 Javascript
jquery.post用法关于type设置问题补充
2014/01/03 Javascript
jQuery实现checkbox列表的全选、反选功能
2016/11/24 Javascript
Angular在模板驱动表单中自定义校验器的方法
2017/08/09 Javascript
layer.confirm取消按钮绑定事件的方法
2018/08/17 Javascript
Vue中对iframe实现keep alive无刷新的方法
2019/07/23 Javascript
vue 解决form表单提交但不跳转页面的问题
2019/10/30 Javascript
原生js实现点击按钮复制内容到剪切板
2020/11/19 Javascript
vue中watch的用法汇总
2020/12/28 Vue.js
[01:10:16]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第一局
2016/02/27 DOTA
Python实现多线程抓取妹子图
2015/08/08 Python
举例讲解Python中字典的合并值相加与异或对比
2016/06/04 Python
Pytorch反向求导更新网络参数的方法
2019/08/17 Python
如何解决django-celery启动后迅速关闭
2019/10/16 Python
python实现布隆过滤器及原理解析
2019/12/08 Python
详解HTML5 window.postMessage与跨域
2017/05/11 HTML / CSS
惠普加拿大在线商店:HP加拿大
2017/09/15 全球购物
美国经典刺绣和字母儿童服装特卖:Smocked Auctions
2018/07/16 全球购物
狗狗玩具、零食和咀嚼物的月度送货服务:Super Chewer
2018/08/22 全球购物
Public Desire美国/加拿大:全球性的在线鞋类品牌
2018/12/17 全球购物
写一个在SQL Server创建表的SQL语句
2012/03/10 面试题
高一政治教学反思
2014/01/28 职场文书
就业协议书
2014/09/12 职场文书
社保转移委托书范本
2014/10/08 职场文书
优秀教育工作者事迹材料
2014/12/24 职场文书
辞职信标准格式
2015/02/27 职场文书
银行自荐信范文
2015/03/25 职场文书
终止解除劳动合同证明书
2015/06/17 职场文书
趣味运动会加油词
2015/07/18 职场文书
最新动漫情报:2022年7月新番定档超过30部, OVERLORD骨王第四季也在其中噢
2022/05/04 日漫