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指定的路径的信息
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
模块pathlib.Path
模块Path 代表访问实际文件系统的“真正路径”。Path 对象可用于判断对应的文件是否存在、是否为文件、是否为目录等。Path 有两个子类,即 PosixPath
和 WindowsPath
。
(1)导入模块及初始化
# 导入主要类
from pathlib import Path
# 初始化
p = Path() # 当前目录
p = Path('a', 'b', 'c/d') # 当前目录下的a/b/c/d
(2)路径拼接和分解
拼接操作符:/
/
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)父目录
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')]
pathlib.PurePath
模块简单来说,PurePath
只是负责对路径字符串执行操作,至于该字符串是否对应实际的路径,它并不关心。
PurePath
有两个子类,即 PurePosixPath
和 PureWindowsPath
,分别代表 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