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

以下代码以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,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,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_dir_fd=None) // 重命名,存在则替换
 os.replace("text.txt","file.txt")
 tups = os.stat(r"text.txt") # 文件属性

 # === 文件读写 ===
 # open(path,flags,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:\\','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,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)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程小技巧。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Python中的函数(二) 在上一篇文章中提到了Python中函数的定义和使用,在这篇文章里我们来讨论下关于函数的一些更深的话题。在学习C语言函数的时候,遇到的问题主要有形参实参的区别、参数的传递和改变、变量的作用域。同样在Python中,关于对函数的理解和使用也存在这些问题。下面来逐一讲解。一.函
Python中的字符串 可能大多数人在学习C语言的时候,最先接触的数据类型就是字符串,因为大多教程都是以&quot;Hello world&quot;这个程序作为入门程序,这个程序中要打印的&quot;Hello world&quot;就是字符串。如果你做过自然语言处理方面的研究,并且用Python
Python 面向对象编程(一) 虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程。下面就来了解一下如何在Python中进行对象编程。一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法。 类是对现实世界中一些事物的封装,
Python面向对象编程(二) 在前面一篇文章中谈到了类的基本定义和使用方法,这只体现了面向对象编程的三大特点之一:封装。下面就来了解一下另外两大特征:继承和多态。 在Python中,如果需要的话,可以让一个类去继承一个类,被继承的类称为父类或者超类、也可以称作基类,继承的类称为子类。并且Pytho
Python中的函数(一) 接触过C语言的朋友对函数这个词肯定非常熟悉,无论在哪门编程语言当中,函数(当然在某些语言里称作方法,意义是相同的)都扮演着至关重要的角色。今天就来了解一下Python中的函数用法。一.函数的定义 在某些编程语言当中,函数声明和函数定义是区分开的(在这些编程语言当中函数声明
在windows下如何快速搭建web.py开发框架 用Python进行web开发的话有很多框架供选择,比如最出名的Django,tornado等,除了这些框架之外,有一个轻量级的框架使用起来也是非常方便和顺手,就是web.py。它由一名黑客所创建,但是不幸的是这位创建者于2013年自杀了。据说现在由
将Sublime Text 2搭建成一个好用的IDE 说起编辑器,可能大部分人要推荐的是Vim和Emacs,本人用过Vim,功能确实强大,但是不是很习惯,之前一直有朋友推荐SUblime Text 2这款编辑器,然后这段时间就试了一下,就深深地喜欢上这款编辑器了...
Python中的模块 有过C语言编程经验的朋友都知道在C语言中如果要引用sqrt这个函数,必须用语句&quot;#include&lt;math.h&gt;&quot;引入math.h这个头文件,否则是无法正常进行调用的。那么在Python中,如果要引用一些内置的函数,该怎么处理呢?在Python中
Python的基础语法 在对Python有了基础的认识之后,下面来了解一下Python的基础语法,看看它和C语言、java之间的基础语法差异。一.变量、表达式和语句 Python中的语句也称作命令,比如print &quot;hello python&quot;这就是一条语句。 表达式,顾名思义,是
Eclipse+PyDevʽjango+Mysql搭建Python web开发环境 Python的web框架有很多,目前主流的有Django、Tornado、Web.py等,最流行的要属Django了,也是被大家最看好的框架之一。下面就来讲讲如何搭建Django的开发环境。一.准备工作 需要下载的
在windows下安装配置Ulipad 今天推荐一款轻便的文本编辑器Ulipad,用来写一些小的Python脚本非常方便。 Ulipad下载地址: https://github.com/limodou/ulipad http://files.cnblogs.com/dolphin0520/u...
Python中的函数(三) 在前面两篇文章中已经探讨了函数的一些相关用法,下面一起来了解一下函数参数类型的问题。在C语言中,调用函数时必须依照函数定义时的参数个数以及类型来传递参数,否则将会发生错误,这个是严格进行规定的。然而在Python中函数参数定义和传递的方式相比而言就灵活多了。一.函数参数的
在Notepad++中搭配Python开发环境 Python在最近几年一度成为最流行的语言之一,不仅仅是因为它简洁明了,更在于它的功能之强大。它不仅能够完成一般脚本语言所能做的事情,还能很方便快捷地进行大规模的项目开发。在学习Python之前我们来看一下Python的历史由来,&quot;Pytho
Python中的条件选择和循环语句 同C语言、Java一样,Python中也存在条件选择和循环语句,其风格和C语言、java的很类似,但是在写法和用法上还是有一些区别。今天就让我们一起来了解一下。一.条件选择语句 Python中条件选择语句的关键字为:if 、elif 、else这三个。其基本形式如
关于raw_input( )和sys.stdin.readline( )的区别 之前一直认为用raw_input( )和sys.stdin.readline( )来获取输入的效果完全相同,但是最近在写程序时有类似这样一段代码:import sysline = sys.stdin.readline()
初识Python 跟学习所有的编程语言一样,首先得了解这门语言的编程风格和最基础的语法。下面就让我们一起来了解一下Python的编程风格。1.逻辑行与物理行 在Python中有逻辑行和物理行这个概念,物理行是指在编辑器中实际看到的一行,逻辑行是指一条Python语句。在Python中提倡一个物理行只
当我们的代码是有访问网络相关的操作时,比如http请求或者访问远程数据库,经常可能会发生一些错误,有些错误可能重新去发送请求就会成功,本文分析常见可能需要重试的场景,并最后给出python代码实现。
1.经典迭代器 2.将Sentence中的__iter__改成生成器函数 改成生成器后用法不变,但更加简洁。 3.惰性实现 当列表比较大,占内存较大时,我们可以采用惰性实现,每次只读取一个元素到内存。 或者使用更简洁的生成器表达式 4.yield from itertools模块含有大量生成器函数可
本文介绍简单介绍socket的常用函数,并以python-kafka中的源码socketpair为例,来讲解python socket的运用
python实践中经常出现编码相关的异常,大多网上找资料而没有理解原理,导致一次次重复错误。本文对常用Unicode、UTF-8、GB2312编码的原理进行介绍,接着介绍了python字符类型unicode和str以及常见编解码错误UnicodeEncodeError和UnicodeDEcodeEr