os pathlib模块

一、os模块

os模块用于文件目录操组

获取相关系统属性

os.sep 		# 列出操作系统的文件分割符(如mac下返回/)
os.linesep 	# 列出当前操作系统的行终止符(换行符)
os.pathsep  # 输出用于分割文件路径的字符串(:)
os.environ  # 返回操作系统的环境变量

os.system('ls')  # 执行操作系统命令

通用操作

import os

os.rename(src, dst)  		# 重命名文件或目录,从src到dst
os.renames(old, new)  		# 递归的对目录进行更名,也可以对文件进行更名
os.chmod(path, mode)  		# 更改文件、目录的权限
os.listdir(path) 			# 列出path目录下所有文件和文件夹的名字列表

文件操作

import os

os.remove(path) 		# 删除路径为path的文件,如果path不是文件,则抛出OSError异常

目录操作

import os

# 下文中的 path 均为 str
os.mkdir(path[, mode]) 		# 创建新目录path,mode表示文件的权限,默认值为:0777
os.rmdir(path) 			    # 删除路径为path的空目录,如果path为非空,则抛出OSError异常
os.makedirs('a/b/c/c/d') 	# 递归生成多级目录
os.removedirs('a/b/c/d') 	# 递归删除多级目录

os.walk(path)  				# 用于对path指定的目录进行遍历
                            # 返回值是一个三元组(root, dirs, files)
                            # root: 指path文件夹本身的路径
                            # dirs: 指path文件夹下所有的文件夹(不包括子目录)
                            # files: 指path文件夹下所有的文件(不包括子目录)

os.getcwd() 			   # 返回当前工作目录
os.chdir(path) 			   # 改变当前工作目录到path
os.stat(path) 			   # 获取path指定的路径的信息

2、os.path模块

os.path.abspath(path) 		# 返回当前文件的绝对路径
os.path.split(path) 		# 将path分割成路径和文件名
os.path.dirname(path) 		# 返回文件上级路径
os.path.basename(path) 		# 返回文件名

os.path.islink(path) 		# 判断是否为连接
os.path.isdir(path) 		# 判断是否是一个文件夹
os.path.isfile(path) 		# 判断path是否是一个文件
os.path.isabs(path) 		# 返回path是否是绝对路径
os.path.exists(path)  		# 如果path存在,返回True,否则返回False

os.path.getsize(path)  		# 返回文件大小名,如果文件不存在就返回错误
os.path.join(path1[, path2[, path3]])  # 把目录和文件名合成一个路径

time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(os.path.getatime(path))) # 返回文件的最后存取时间(是时间戳格式, 需要先转换为本地时间,在转换为格式化的字符串格式)

time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(os.path.getmtime(path))) # 返回文件最后修改时间(是时间戳格式, 需要先转换为本地时间,在转换为格式化的字符串格式)

time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(os.path.getctime(path))) # 返回文件的创建时间(是时间戳格式, 需要先转换为本地时间,在转换为格式化的字符串格式)

二、sys.path模块

sys模块包含了与python解释器和它的环境有关的函数, 里面有个 sys.path属性。它是一个list。默认情况下python导入文件或者模块的话,他会先在sys.path里找模块的路径。如果没有的话,程序就会报错。sys.path一般用于操作系统环境变量。

(1)path[0]

此列表的第一项,path[0],在程序启动时初始化,是包含用来调用Python解释器的脚本的目录。如果脚本目录不可用(例如,如果解释器被交互式地调用,或者脚本是从标准输入读取的),path[0]是空字符串,它引导Python首先在当前目录中搜索模块。

>>> import sys
>>> print('\n'.join(sys.path))

/Users/didi/.pyenv/versions/3.6.4/lib/python36.zip
/Users/didi/.pyenv/versions/3.6.4/lib/python3.6
/Users/didi/.pyenv/versions/3.6.4/lib/python3.6/lib-dynload
/Users/didi/.pyenv/versions/3.6.4/lib/python3.6/site-packages
>>> 

(2)标准库

    lib目录下(home目录\pythonXX\lib)

(3)第三方库

    在lib目录下的site-package目录下(home目录\pythonXX\lib\site-packages)

(4)修改path

    一个程序可以根据它自己的目的自由地修改path列表。

    场景:在实际开发中,默认包含了当前目录为搜索路径,所以,当前目录下的模块和子模块均可以正常访问。

    但是若一个模块需要import平级的不同目录的模块,或者上级目录里面的模块,就可以通过修改path来实现。

    修改path常用两种方法:

方法一:函数添加

这是即时生效的方法,就是在模块里面修改sys.path值,这种方法修改的sys.path作用域只是当前进程,进程结束后就失效了。 个人比较推荐这种方法,比较干净, 避免一些冲突问题。

比如现在的代码目录结构:

/src/configs/config.py
/src/common/Database.py

假如Database.py期望导入config.py,则可以增加上级目录到sys.path列表里面:

parent_path = os.path.dirname(sys.path[0])
if parent_path not in sys.path:
    sys.path.append(parent_path)
import configs.config

方法二:添加.pth文件

site-packages/增加一个路径文件,如mypkpath.pth,必须以.pth为后缀,将模块的路径写进去,一行一个路径,写上要加入的模块文件所在的目录名称。这种方法一劳永逸, 简单暴力。

举个例子,将/tmp/增加到sys.path 首先cd到指定python的sit-packages/目录下,然后创建一个文件,例如test.pth(注意后缀要为.pth),在文件中增加/tmp/路径信息,保存退出。

python2.7/site-packages/test.pth文件中添加一条:

/tmp/

三、pathlib模块

1、pathlib.Path 模块

Path 代表访问实际文件系统的“真正路径”。Path 对象可用于判断对应的文件是否存在、是否为文件、是否为目录等。Path 有两个子类,即 PosixPathWindowsPath

(1)导入模块及初始化

# 导入主要类
from pathlib import Path

# 初始化
p = Path()  # 当前目录
p = Path('a', 'b', 'c/d')  # 当前目录下的a/b/c/d

(2)路径拼接和分解

拼接操作符/

  • Path对象 / Path对象
  • Path对象 / 字符串
  • 字符串 / Path对象

分解操作
parts属性,可以返回路径中的每一部分

joinpath操作
joinpath(*other)连接多个字符串到Path对象中

from pathlib import Path

p = Path()  # 返回当前路径
print(p)

p = p / 'a'  # 路径连接
print(p)
p = 'b' / p
print(p)

p3 = Path('/Users/didi/Desktop')
p = p3.parts
print(p)

p3 = Path()
p4 = p3.joinpath('Users', 'didi', 'file')
print(p4)

获取路径
获取路径字符串,获取路径字符串的bytes

p = Path('Users/didi/Desktop/private')

print(str(p), bytes(p))
# Users/didi/Desktop/private b'Users/didi/Desktop/private'

(3)父目录

  • parent属性:目录的逻辑父目录。
  • parents属性:父目录序列,索引0是直接的父目录,索引越大越接近根目录。
p = Path('Users/didi/Desktop/private')

print(p.parent)
print(p.parents[0])

(4)文件名

  • name 目录的最后一个部分
  • suffix 目录中最后一个部分的扩展名
  • suffixes 返回多个扩展名列表
  • stem 目录最后一个部分,没有后缀
  • with_name(name) 替换目录最后一个部分并返回一个新的路径
  • with_suffix(suffix) 替换扩展名,返回新的路径,扩展名存在则不变
  • cwd() 返回一个表示当前目录的新路径对象
  • home() 返回一个表示当前用户HOME目录的新路径对象
p = Path('/hidog/text.tar.gz')
print(p.name)
# 'text.tar.gz'

print(p.suffix)
# '.gz'

print(p.suffixes)
# ['.tar', '.gz']

print(p.stem)
# 'text.tar'

p.with_name('haha.tgz')
print(p.with_name('haha.tgz'))
# '/hidog/haha.tgz'

p.with_suffix('.gz')
print(p.with_suffix('.gz'))
# '/hidog/text.tar.gz'

p.with_suffix('.txt')
print(p.with_suffix('.txt'))
# '/hidog/text.tar.txt'

p1 = Path.cwd()
print(p1)
# /Users/didi/Desktop/python/pathlib

p2 = Path.home()
print(p2)
# /Users/didi

(5)判断路径的类型

  • is_dir() 是否是目录
  • is_file() 是否是普通文件
  • is_symlink() 是否是软链接
  • is_socket() 是否是socket文件
  • is_block_device() 是否是块设备
  • is_char_device() 是否是字符设备
  • is_absolute() 是否是绝对路径
from pathlib import Path

path = Path('/Users/didi/Desktop/hello')

isPathTrue = path.is_dir()
print(isPathTrue)
# True

isFile = path.is_file()
print(isFile)
# False

isSysLink = path.is_symlink()
print(isSysLink)
# False

isSocket = path.is_socket()
print(isSocket)
# False

isBlockDevice = path.is_block_device()
print(isBlockDevice)
# False

isCharDevice = path.is_char_device()
print(isCharDevice)
# False

isAbsolutpath = path.is_absolute()
print(isAbsolutpath)
#True

  • resolve() 返回一个新的路径,这个新路径就是当前Path对象的绝对路径,如果是软链接则直接被解析
  • absolute() 也可以获取绝对路径,但是推荐resolve()
  • exists()该路径是否指向现有的目录或文件
path = Path('./test')
isAbsolutpath = path.is_absolute()
print(isAbsolutpath)  # False

# path = path.resolve()
path = path.absolute()
print(path)  # /Users/didi/Desktop/python/pathlib/test

isCurrDir = path.exists()
print(isCurrDir)  # True

  • touch(mode=0o666, exist_ok=True) 创建一个文件
  • mkdir(mode=0o777, parents=False, exist_ok=False) 创建目录
    • parents:是否创建父目录,True等同mkdir -p;False时,父目录不存在,则抛出FileNotFoundError
    • exist_ok:在3.5版本加入。False时,路径存在,抛出FileExistsError;True时,FileExistsError被忽略
from pathlib import Path

path = Path('/Users/didi/Desktop/python/pathlib/test.py')
path.touch(mode=0o666, exist_ok=True)  				# 创建test.py文件

path = Path('/Users/didi/Desktop/python/pathlib/test')
path.mkdir(mode=0o777, parents=True, exist_ok=True)  # 创建test目录

  • iterdir() 迭代当前目录:
path = Path('/Users/didi/Desktop/python/pathlib/')
print([x for x in path.iterdir()])

# [PosixPath('/Users/didi/Desktop/python/pathlib/test'), 

# PosixPath('/Users/didi/Desktop/python/pathlib/test.py'), 

# PosixPath('/Users/didi/Desktop/python/pathlib/test_pathlib.py')]

2、pathlib.PurePath 模块

简单来说,PurePath 只是负责对路径字符串执行操作,至于该字符串是否对应实际的路径,它并不关心。

PurePath 有两个子类,即 PurePosixPathPureWindowsPath,分别代表 UNIX 风格的路径(包括 Mac OS X)和 Windows 风格的路径。

from pathlib import *

# 创建PurePath,实际上使用PureWindowsPath
pp = PurePath('setup.py')
print(type(pp))  			# 

pp = PurePath('crazyit', 'some/path', 'info')
# 看到输出Windows风格的路径
print(pp)					# 'crazyit\some\path\info'

# 明确指定创建PurePosixPath
pp = PurePosixPath('crazyit', 'some/path', 'info')
# 看到输出Unix风格的路径
print(pp) # crazyit/some/path/info

如果在创建 PurePath 时不传入任何参数,系统默认创建代表当前路径的 PurePath,相当于传入点号(代表当前路径)作为参数。例如如下代码:

# 如果不传入参数,默认使用当前路径
pp = PurePath()
print(pp) # .

如果在创建 PurePath 时传入的参数包含多个根路径,则只有最后一个根路径及后面的子路径生效。例如如下代码:

# 如果传入参数包含多个根路径,则只有最后一个根路径及后面子路径生效
pp = PurePosixPath('/etc', '/usr', 'lib64')
print(pp)			 # /usr/lib64
pp = PureWindowsPath('c:/Windows', 'd:info')
print(pp) 			 # d:info

属性和方法

PurePath 提供了不少属性和方法,这些属性和方法主要还是用于操作路径字符串。由于 PurePath 并不真正执行底层的文件操作,也不理会路径字符串在底层是否有对应的路径,因此这些操作有点类似于字符串方法:

  • PurePath.parts:该属性返回路径字符串中所包含的各部分。
  • PurePath.drive:该属性返回路径字符串中的驱动器盘符。
  • PurePath.root:该属性返回路径字符串中的根路径。
  • PurePath.anchor:该属性返回路径字符串中的盘符和根路径。
  • PurePath.parents:该属性返回当前路径的全部父路径。
  • PurPath.parent:该属性返回当前路径的上一级路径,相当于 parents[0] 的返回值。
  • PurePath.name:该属性返回当前路径中的文件名。
  • PurePath.suffixes:该属性返回当前路径中的文件所有后缀名。
  • PurePath.suffix:该属性返回当前路径中的文件后缀名。相当于 suffixes 属性返回的列表的最后一个元素。
  • PurePath.stem:该属性返回当前路径中的主文件名。
  • PurePath.as_posix():将当前路径转换成 UNIX 风格的路径。
  • PurePath.as_uri():将当前路径转换成 URI。只有绝对路径才能转换,否则将会引发 ValueError
  • PurePath.is_absolute():判断当前路径是否为绝对路径。
  • PurePath.joinpath(*other):将多个路径连接在一起,作用类似于前面介绍的斜杠运算符。
  • PurePath.match(pattern):判断当前路径是否匹配指定通配符。
  • PurePath.relative_to(*other):获取当前路径中去除基准路径之后的结果。
  • PurePath.with_name(name):将当前路径中的文件名替换成新文件名。如果当前路径中没有文件名,则会引发 ValueError
  • PurePath.with_suffix(suffix):将当前路径中的文件后缀名替换成新的后缀名。如果当前路径中没有后缀名,则会添加新的后缀名。
from pathlib import *

# 访问drive属性
print(PureWindowsPath('c:/Program Files/').drive) # c:
print(PureWindowsPath('/Program Files/').drive) # ''
print(PurePosixPath('/etc').drive) # ''

# 访问root属性
print(PureWindowsPath('c:/Program Files/').root) # \
print(PureWindowsPath('c:Program Files/').root) # ''
print(PurePosixPath('/etc').root) # /

# 访问anchor属性
print(PureWindowsPath('c:/Program Files/').anchor) # c:\
print(PureWindowsPath('c:Program Files/').anchor) # c:
print(PurePosixPath('/etc').anchor) # /

# 访问parents属性
pp = PurePath('abc/xyz/wawa/haha')
print(pp.parents[0]) # abc\xyz\wawa
print(pp.parents[1]) # abc\xyz
print(pp.parents[2]) # abc
print(pp.parents[3]) # .
# 访问parent属性
print(pp.parent) # abc\xyz\wawa

# 访问name属性
print(pp.name) # haha
pp = PurePath('abc/wawa/bb.txt')
print(pp.name) # bb.txt

pp = PurePath('abc/wawa/bb.txt.tar.zip')
# 访问suffixes属性
print(pp.suffixes[0]) # .txt
print(pp.suffixes[1]) # .tar
print(pp.suffixes[2]) # .zip
# 访问suffix属性
print(pp.suffix) # .zip
print(pp.stem) # bb.txt.tar

pp = PurePath('abc', 'xyz', 'wawa', 'haha')
print(pp) # abc\xyz\wawa\haha
# 转成Unix风格的路径
print(pp.as_posix()) # abc/xyz/wawa/haha
# 将相对路径转换成Uri引发异常
#print(pp.as_uri()) # ValueError
# 创建绝对路径
pp = PurePath('d:/', 'Python', 'Python3.6')
# 将绝对路径转换成Uri
print(pp.as_uri()) # file:///d:/Python/Python3.6

# 判断当前路径是否匹配指定模式
print(PurePath('a/b.py').match('*.py')) # True
print(PurePath('/a/b/c.py').match('b/*.py')) # True
print(PurePath('/a/b/c.py').match('a/*.py')) # False

pp = PurePosixPath('c:/abc/xyz/wawa')
# 测试relative_to方法
print(pp.relative_to('c:/'))  # abc\xyz\wawa
print(pp.relative_to('c:/abc'))  # xyz\wawa
print(pp.relative_to('c:/abc/xyz'))  # wawa

# 测试with_name方法
p = PureWindowsPath('e:/Downloads/pathlib.tar.gz')
print(p.with_name('fkit.py')) # e:\Downloads\fkit.py
p = PureWindowsPath('c:/')
#print(p.with_name('fkit.py')) # ValueError

# 测试with_suffix方法
p = PureWindowsPath('e:/Downloads/pathlib.tar.gz')
print(p.with_suffix('.zip'))  # e:\Downloads\pathlib.tar.zip
p = PureWindowsPath('README')
print(p.with_suffix('.txt'))  # README.txt

你可能感兴趣的:(Python3,模块)