auther: Lart
date: 2019-01-17
update: 2019-01-18 09:55:36html
针对某些操做, 官方推荐这些操做node
This module provides a portable way of using operating system dependent functionality.python
open()
os.path
modulefileinput
moduletempfile
moduleshutil
module.# 在操做系统中定义的环境变量,所有保存在os.environ这个变量中,能够直接查看: >>> os.environ environ({...'LD_LIBRARY_PATH': '/usr/local/cuda-9.0/lib64:/usr/local/cuda-9.0/lib64', ..., 'LC_IDENTIFICATION': 'zh_CN.UTF-8', ...}) # 要获取某个环境变量的值,能够调用以下操做: >>> os.environ['MANPATH'] '/home/lart/texlive/2018/texmf-dist/doc/man:/usr/local/man:' >>> os.environ.get('MANPATH') '/home/lart/texlive/2018/texmf-dist/doc/man:/usr/local/man:' >>> os.environ.get('MANPATH', 'not found') '/home/lart/texlive/2018/texmf-dist/doc/man:/usr/local/man:' >>> os.environ.get('MAINPATH', 'not found') 'not found' >>> os.environ('MAINPATH') Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: '_Environ' object is not callable >>> os.getenv('MANPATH') '/home/lart/texlive/2018/texmf-dist/doc/man:/usr/local/man:' >>> os.getenv('MAINPATH', "not found") 'not found' # os.getenv最大的差别就在于不存在路径的时候, 不会引起异常 >>> os.getenv('MAINPATH')
python调用Shell脚本,有两种方法:os.system(command)
或os.popen(command)
, 前者返回值是脚本的退出状态码, 后者的返回值是脚本执行过程当中的输出内容. 实际使用时视需求状况而选择.linux
# 经过 os.popen() 返回的是 file read 的对象,对其进行读取 read() 的操做能够看到执行的输出。 output = os.popen('cat /proc/cpuinfo') print(output.read())
import sys
)# 获取系统类型 >>> os.name 'posix' >>> os.uname() posix.uname_result(sysname='Linux', nodename='lart', release='4.15.0-43-generic', version='#46-Ubuntu SMP Thu Dec 6 14:45:28 UTC 2018', machine='x86_64') >>> os.uname()[0] 'Linux' >>> os.uname()[4] 'x86_64' >>> import sys >>> sys.platform 'linux' # 获取当前路径/父路径的标识符 >>> os.curdir '.' >>> os.pardir '..' # 获取路径分隔符和换行符的表示 >>> os.sep '/' >>> os.linesep '\n' # 获取当前系统环境变量分隔符 >>> os.pathsep ':' # 获取cpu核心数 # 此数字不等于当前进程可使用的CPU数量。可使用`len(os.sched_getaffinity(0))`得到可用CPU的数量 >>> os.cpu_count() 12 >>> len(os.sched_getaffinity(0)) 12
OSError
FileExistsError
is raised.OSError
if the leaf directory could not be successfully removedexist_ok
is False (the default), an OSError
is raised if the target directory already exists.makedirs()
will become confused if the path elements to create include pardir (eg. “..” on UNIX systems).src
改成dst
OSError
will be raised. 若是src
参数对应文件或目录不存在, 以及若是dst
参数对应文件或目录已经存在,都会报错replace()
.###################################################################################### # 返回当前进程工做路径 >>> os.getcwd() '/home/lart/md/python总结' ###################################################################################### # 返回指定path下的文件夹与文件(包含后缀名)的完整名字, 不包含'.', '..'这样的特殊目录 >>> os.listdir('.') ['converter.py', 'face++.py', 'Face++.ipynb', 'person-young-man-beard-emotions-157966.png', '.ipynb_checkpoints', '.idea', 'supervisely.py', 'facepp-python-sdk-master'] ###################################################################################### # 使用内容管理器管理os.scandir迭代器, 返回的是一个`os.DirEntry`对象, 相比`os.listdir`能够得到更多的信息 # `os.DirEntry` Object yielded by scandir() to expose the file path and other file attributes of a directory entry. # 包含以下属性与方法: `name, path, inode(), is_dir(*, follow_symlinks=True), is_file(*, follow_symlinks=True), is_symlink(), stat(*, follow_symlinks=True)` >>> with os.scandir('.') as it: ... for entry in it: ... if not entry.name.startswith('.') and entry.is_file(): ... print(entry.name) ... if entry.is_dir(): ... print(f"{entry.name}是名字") ... converter.py face++.py Face++.ipynb person-young-man-beard-emotions-157966.png .ipynb_checkpoints是名字 .idea是名字 supervisely.py facepp-python-sdk-master是名字
有目录:git
➜ tool_scripts tree . ├── converter.py ├── Face++.ipynb ├── facepp-python-sdk-master │ ├── call_four_task.ipynb │ ├── call.py │ ├── facepp_custom.py │ ├── imgResource │ │ ├── demo.jpeg │ │ ├── gray_image.png │ │ ├── merge.jpg │ │ ├── resultImg.jpg │ │ ├── resultImg.png │ │ ├── search.png │ │ ├── segment.b64 │ │ └── segment.jpg │ ├── PythonSDK │ │ ├── compat.py │ │ ├── facepp.py │ │ ├── ImagePro.py │ │ ├── __pycache__ │ │ │ ├── compat.cpython-36.pyc │ │ │ ├── facepp.cpython-36.pyc │ │ │ ├── ImagePro.cpython-36.pyc │ │ │ └── structures.cpython-36.pyc │ │ └── structures.py │ ├── Python SDK demo 使用文档.pdf │ └── README.md ├── face++.py ├── person-young-man-beard-emotions-157966.png └── supervisely.py 4 directories, 26 files
###################################################################################### # os.walk(top, topdown=True, onerror=None, followlinks=False) # top 是要便利的目录的地址, 为最上层的地址 # topdown 为True(默认为True),则优先遍历父目录(先把父目录里的全部文件(文件夹)遍历完, 在搜索子文件夹),不然优先遍历top的子目录 (广度优先与深度优先) # onerror 须要一个callable对象,当walk须要异常时,会调用 # followlinks若是为True,则会遍历目录下的快捷方式(linux下是`symbolic link`)实际所指的目录(默认False) # # os.walk 的返回值是一个生成器(generator),也就是说不断的遍历它,来得到全部的内容。 # 每次遍历的对象都是返回的是一个三元组`(dirpath, dirnames, filenames)` # dirpath (string)当前正在遍历的这个文件夹的自己的地址 # dirnames (list)**该文件夹中** 全部的 *子文件夹* 的名字(不包括子目录, excluding '.' and '..') # filenames (list)**该文件夹中** 全部的 *文件* 的名字 # 注意: # - 名字列表中不包含完整路径, 要想获得完整的路径, 可使用`os.path.join(dirpath, name)`. # - 当设定`followlinks`为True时, 如果连接指向父文件夹, 会致使无线递归, 由于`.walk()`不会关注搜索过得部分 # - 若是传递相对路径名,请不要在`walk()`的恢复之间更改当前工做目. `walk()`从不更改当前目录, 并假定其调用者也不会 ############################################################################### # 下面使用了`topdown=True` >>> for dirpath, dirnames, filenames in os.walk('.'): ... print(dirpath) ... print(dirnames) ... print(filenames) ... . ['.ipynb_checkpoints', '.idea', 'facepp-python-sdk-master'] ['converter.py', 'face++.py', 'Face++.ipynb', 'person-young-man-beard-emotions-157966.png', 'supervisely.py'] ./.ipynb_checkpoints [] ['Face++-checkpoint.ipynb'] ./.idea [] ['misc.xml', 'modules.xml', 'workspace.xml', 'tool_scripts.iml', 'encodings.xml'] ./facepp-python-sdk-master ['imgResource', 'PythonSDK', '.ipynb_checkpoints', '.idea'] ['call.py', 'facepp_custom.py', 'call_four_task.ipynb', 'Python SDK demo 使用文档.pdf', 'README.md', '.gitignore'] ./facepp-python-sdk-master/imgResource [] ['demo.jpeg', 'resultImg.jpg', 'merge.jpg', 'gray_image.png', 'segment.jpg', 'search.png', 'segment.b64', 'resultImg.png'] ./facepp-python-sdk-master/PythonSDK ['__pycache__'] ['compat.py', 'facepp.py', 'ImagePro.py', 'structures.py'] ./facepp-python-sdk-master/PythonSDK/__pycache__ [] ['compat.cpython-36.pyc', 'facepp.cpython-36.pyc', 'ImagePro.cpython-36.pyc', 'structures.cpython-36.pyc'] ./facepp-python-sdk-master/.ipynb_checkpoints [] ['call_four_task-checkpoint.ipynb'] ./facepp-python-sdk-master/.idea [] ['misc.xml', 'modules.xml', 'facepp-python-sdk-master.iml', 'workspace.xml', 'encodings.xml'] ############################################################################### # 下面使用了`topdown=False` >>> for dirpath, dirnames, filenames in os.walk('.', topdown=False): ... print(dirpath) ... print(dirnames) ... print(filenames) ... ./.ipynb_checkpoints [] ['Face++-checkpoint.ipynb'] ./.idea [] ['misc.xml', 'modules.xml', 'workspace.xml', 'tool_scripts.iml', 'encodings.xml'] ./facepp-python-sdk-master/imgResource [] ['demo.jpeg', 'resultImg.jpg', 'merge.jpg', 'gray_image.png', 'segment.jpg', 'search.png', 'segment.b64', 'resultImg.png'] ./facepp-python-sdk-master/PythonSDK/__pycache__ [] ['compat.cpython-36.pyc', 'facepp.cpython-36.pyc', 'ImagePro.cpython-36.pyc', 'structures.cpython-36.pyc'] ./facepp-python-sdk-master/PythonSDK ['__pycache__'] ['compat.py', 'facepp.py', 'ImagePro.py', 'structures.py'] ./facepp-python-sdk-master/.ipynb_checkpoints [] ['call_four_task-checkpoint.ipynb'] ./facepp-python-sdk-master/.idea [] ['misc.xml', 'modules.xml', 'facepp-python-sdk-master.iml', 'workspace.xml', 'encodings.xml'] ./facepp-python-sdk-master ['imgResource', 'PythonSDK', '.ipynb_checkpoints', '.idea'] ['call.py', 'facepp_custom.py', 'call_four_task.ipynb', 'Python SDK demo 使用文档.pdf', 'README.md', '.gitignore'] . ['.ipynb_checkpoints', '.idea', 'facepp-python-sdk-master'] ['converter.py', 'face++.py', 'Face++.ipynb', 'person-young-man-beard-emotions-157966.png', 'supervisely.py']
os.path
>>> os.path.commonprefix(['/usr/lib', '/usr/local/lib']) '/usr/l' >>> os.path.commonpath(['/usr/lib', '/usr/local/lib']) '/usr'
>>> path = '/home/lart/Datasets/tool_scripts' >>> os.path.dirname(path) '/home/lart/Datasets' >>> path = '/home/lart/Datasets/tool_scripts/converter.py' >>> os.path.dirname(path) '/home/lart/Datasets/tool_scripts'
'/home/lart/Datasets' >>> os.path.exists(path) True >>> path = '/home/lart/Datasets/tool_scripts/converter.py' >>> os.path.exists(path) True
~
为用户目录(HOME)实际值>>> path = '~/Datasets/tool_scripts/converter.py' >>> os.path.expanduser(path) '/home/lart/Datasets/tool_scripts/converter.py' >>> path = '~/Datasets/tool_scripts' >>> os.path.expanduser(path) '/home/lart/Datasets/tool_scripts'
>>> path = '/home/lart/Datasets/tool_scripts' >>> os.path.getctime(path) 1547694633.120985 >>> os.path.getctime(path + '/converter.py') 1546766886.501085
>>> path = '/home/lart/Datasets/tool_scripts' >>> os.path.getsize(path) 4096 >>> os.path.getsize(path + '/converter.py') 857
os.path.join("c:", "foo")
represents a path relative to the current directory on drive C: (c:foo)
, not c:\foo
.A//B
,A/B/
,A/./B
和A/foo/../B
都变为A/B
.normcase()
(head, tail)
,其中tail是最后一个路径名组件,head是指向该路径的全部内容, tail永远不会有斜线; 若是path以斜线结尾,则tail将为空; 若是路径中没有斜杠,则head将为空path
为空,则head和tail都为空join(head, tail)
返回与path相同位置的路径(但字符串可能不一样).(drive, tail)
,其中drive是挂载点或空字符串. 在不使用驱动器规格的系统上,drive将始终为空字符串drive + tail
将与path
相同。(root, ext)
, 使得root + ext == path
,ext为空或以.
开头,最多包含一个句点. basename
的前导.
被忽略splitext('.cshrc')
返回('.cshrc','')
。glob模块根据Unix shell使用的规则查找与指定模式匹配的全部路径名,尽管结果以任意顺序返回。正则表达式
实现了:shell
*
表示匹配0到多个字符?
表示匹配一个字符[]
表示匹配括号里表示的字符范围
[exp]
匹配指定范围内的字符,如:[1-9]
匹配1至9范围内的字符, 破折號(-)表示一個範圍, 上面的範圍也可直接用[0123456789]來表示[!exp]
匹配不在指定范围内的字符'[?]'
匹配字符'?'
glob中模式規則不是正則表達式, 而是, 符合標準Uinx路徑擴展規則. 可是Shell變量名和符號(~)是不被擴充的, 只有一些特殊的字符: 兩個不一样的通配符和字母範圍被支持(见上). 对于~
符和shell变量扩展,请使用os.path.expanduser()
和os.path.expandvars(0)
. 模塊規則適合於文檔名的片断(以/為分隔, 也就是只能匹配/
与/
之间的文本), 但模式中的路徑能够是相對或者絕對路徑.ide
这是经过一致地使用os.scandir()
和fnmatch.fnmatch()
函数来完成的,而不是经过实际调用子shell。请注意,与fnmatch.fnmatch()
不一样,glob将以点(.)
开头的文件名视为特殊状况, 通配符不会进行匹配. 可见后面的例子.函数
sorted()
排序)匹配路径名字列表, 这个pathname
必须是包含路径规范的字符串recursive
为true
,则模式**
将匹配任何文件以及零个或多个目录和子目录, 若是模式后跟os.sep
,则只有目录和子目录匹配**
模式可能会消耗过多的时间。>>> import glob >>> path '/home/lart/Datasets/tool_scripts' >>> glob.iglob(path + '/*') <generator object _iglob at 0x7fdca3773930> # 这里只返回下一级 >>> glob.glob(path + '/*', recursive=True) ['/home/lart/Datasets/tool_scripts/converter.py', '/home/lart/Datasets/tool_scripts/face++.py', '/home/lart/Datasets/tool_scripts/Face++.ipynb', '/home/lart/Datasets/tool_scripts/person-young-man-beard-emotions-157966.png', '/home/lart/Datasets/tool_scripts/supervisely.py', '/home/lart/Datasets/tool_scripts/facepp-python-sdk-master'] # 这里会遍历全部的子目录和文件 >>> glob.glob(path + '/**', recursive=True) ['/home/lart/Datasets/tool_scripts/', '/home/lart/Datasets/tool_scripts/converter.py', '/home/lart/Datasets/tool_scripts/face++.py', '/home/lart/Datasets/tool_scripts/Face++.ipynb', '/home/lart/Datasets/tool_scripts/person-young-man-beard-emotions-157966.png', '/home/lart/Datasets/tool_scripts/supervisely.py', '/home/lart/Datasets/tool_scripts/facepp-python-sdk-master', '/home/lart/Datasets/tool_scripts/facepp-python-sdk-master/call.py', '/home/lart/Datasets/tool_scripts/facepp-python-sdk-master/imgResource', '/home/lart/Datasets/tool_scripts/facepp-python-sdk-master/imgResource/demo.jpeg', '/home/lart/Datasets/tool_scripts/facepp-python-sdk-master/imgResource/resultImg.jpg', '/home/lart/Datasets/tool_scripts/facepp-python-sdk-master/imgResource/merge.jpg', '/home/lart/Datasets/tool_scripts/facepp-python-sdk-master/imgResource/gray_image.png', '/home/lart/Datasets/tool_scripts/facepp-python-sdk-master/imgResource/segment.jpg', '/home/lart/Datasets/tool_scripts/facepp-python-sdk-master/imgResource/search.png', '/home/lart/Datasets/tool_scripts/facepp-python-sdk-master/imgResource/segment.b64', '/home/lart/Datasets/tool_scripts/facepp-python-sdk-master/imgResource/resultImg.png', '/home/lart/Datasets/tool_scripts/facepp-python-sdk-master/PythonSDK', '/home/lart/Datasets/tool_scripts/facepp-python-sdk-master/PythonSDK/compat.py', '/home/lart/Datasets/tool_scripts/facepp-python-sdk-master/PythonSDK/facepp.py', '/home/lart/Datasets/tool_scripts/facepp-python-sdk-master/PythonSDK/__pycache__', '/home/lart/Datasets/tool_scripts/facepp-python-sdk-master/PythonSDK/__pycache__/compat.cpython-36.pyc', '/home/lart/Datasets/tool_scripts/facepp-python-sdk-master/PythonSDK/__pycache__/facepp.cpython-36.pyc', '/home/lart/Datasets/tool_scripts/facepp-python-sdk-master/PythonSDK/__pycache__/ImagePro.cpython-36.pyc', '/home/lart/Datasets/tool_scripts/facepp-python-sdk-master/PythonSDK/__pycache__/structures.cpython-36.pyc', '/home/lart/Datasets/tool_scripts/facepp-python-sdk-master/PythonSDK/ImagePro.py', '/home/lart/Datasets/tool_scripts/facepp-python-sdk-master/PythonSDK/structures.py', '/home/lart/Datasets/tool_scripts/facepp-python-sdk-master/facepp_custom.py','/home/lart/Datasets/tool_scripts/facepp-python-sdk-master/call_four_task.ipynb', '/home/lart/Datasets/tool_scripts/facepp-python-sdk-master/Python SDK demo 使用文档.pdf', '/home/lart/Datasets/tool_scripts/facepp-python-sdk-master/README.md'] >>> glob.glob('./[0-9].*') ['./1.gif', './2.txt'] >>> glob.glob('*.gif') ['1.gif', 'card.gif'] >>> glob.glob('?.gif') ['1.gif'] >>> glob.glob('**/*.txt', recursive=True) ['2.txt', 'sub/3.txt'] >>> glob.glob('./**/', recursive=True) ['./', './sub/']
If the directory contains files starting with .
they won’t be matched by default. 须要在匹配路径名字上补上符号.
测试
For example, consider a directory containing card.gif
and .card.gif
:
>>> >>> import glob >>> glob.glob('*.gif') ['card.gif'] >>> glob.glob('.c*') ['.card.gif']
escape('//?/c:/Quo vadis?.txt')
將返回'//?/c:/Quo vadis[?].txt'
.[?]
即是字符?
的转义# https://hk.saowen.com/a/83de58e8a7e060d8ace69c912cbd209948d6c4fe533aa2746201d96a1b45a8bf import glob specials = '?*[' for char in specials: pattern = 'dir/*' + glob.escape(char) + '.txt' print('Searching for: {!r}'.format(pattern)) for name in sorted(glob.glob(pattern)): print(name) print() # 输出 Searching for: 'dir/*[?].txt' dir/file?.txt Searching for: 'dir/*[*].txt' dir/file*.txt Searching for: 'dir/*[[].txt' dir/file[.txt
# https://www.jianshu.com/p/b1f24d56d73b >>> glob.escape('./**.?.*.[a-z]') './[*][*].[?].[*].[[]a-z]'
此模块提供对Unix shell样式通配符的支持,这些通配符与正则表达式(在re模块中记录)不一样。shell样式通配符中使用的特殊字符是:
*
表示匹配0到多个字符?
表示匹配一个字符[]
表示匹配括号里表示的字符范围
[exp]
匹配指定范围内的字符,如:[1-9]
匹配1至9范围内的字符, 破折號(-)表示一個範圍, 上面的範圍也可直接用[0123456789]來表示[!exp]
匹配不在指定范围内的字符'[?]'
匹配字符'?'
请注意:
/
)对于此模块并非特殊字符。与glob
模块略有不一样.
开头的文件名对于此模块并非特殊字符,而且可用*
和?
匹配主要的方法:
os.path.normcase()
进行大小写规范化。fnmatchcase()
可用于执行区分大小写的比较,不管这是不是操做系统的标准。os.path.normcase()
。[n for n in names if fnmatch(n, pattern)]
相同,但实现更有效。re.match()
一块儿使用。对于目录:
>>> print(os.popen('tree -a -L 2').read()) . ├── converter.py ├── Face++.ipynb ├── facepp-python-sdk-master │ ├── call_four_task.ipynb │ ├── call.py │ ├── facepp_custom.py │ ├── .gitignore │ ├── .idea │ ├── imgResource │ ├── .ipynb_checkpoints │ ├── PythonSDK │ ├── Python SDK demo 使用文档.pdf │ └── README.md ├── face++.py ├── .idea │ ├── encodings.xml │ ├── misc.xml │ ├── modules.xml │ ├── tool_scripts.iml │ └── workspace.xml ├── .ipynb_checkpoints │ └── Face++-checkpoint.ipynb ├── person-young-man-beard-emotions-157966.png ├── supervisely.py └── .test
从下面的测试能够看出来, 实际上, glob
应该更为经常使用一些, fnmatch
模块不会忽略.
开头的文件(夹), 这有时候会形成没必要要的麻烦, 因大多数时候, 是不会须要搜索这些文件夹的.
>>> import fnmatch >>> for file in os.listdir('.'): ... if fnmatch.fnmatch(file, '*'): ... print(file) ... converter.py face++.py .test Face++.ipynb person-young-man-beard-emotions-157966.png .ipynb_checkpoints .idea supervisely.py facepp-python-sdk-master >>> glob.glob('./*') ['./converter.py', './face++.py', './Face++.ipynb', './person-young-man-beard-emotions-157966.png', './supervisely.py', './facepp-python-sdk-master']
>>> import fnmatch, re >>> >>> regex = fnmatch.translate('*.txt') >>> regex '(?s:.*\\.txt)\\Z' >>> reobj = re.compile(regex) >>> reobj.match('foobar.txt') <re.Match object; span=(0, 10), match='foobar.txt'>