import os, glob, fnmatch
基于官方3.7文档, 3.6以上都没问题
auther: Lart
date: 2019-01-17
update: 2019-01-18 09:55:36
文章目录
- import os, glob, fnmatch
- 环境变量
- 系统指令
- 系统信息
- 文件(夹)操作
- 路径获取
- `os.path`
- 路径显示
- 路径判断
- 路径时间
- 路径体积
- 路径规范
- glob
- fnmatch
- 参考链接
针对某些操作, 官方推荐这些操作
This module provides a portable way of using operating system dependent functionality.
- If you just want to read or write a file see
open()
- if you want to manipulate paths, see the
os.path
module - if you want to read all the lines in all the files on the command line see the
fileinput
module - for creating temporary files and directories see the
tempfile
module - for high-level file and directory handling see the
shutil
module.
环境变量
- os.environ
- os.getenv(key, default=None)
系统指令
- os.system(command)
- 返回值只会有0(成功), 1, 2
- os.popen(command)
- 把执行的cmd的输出作为值返回
python调用Shell脚本,有两种方法:os.system(command)
或os.popen(command)
, 前者返回值是脚本的退出状态码, 后者的返回值是脚本执行过程中的输出内容. 实际使用时视需求情况而选择.
系统信息
- os.name
- os.uname()
- sys.platform(
import sys
) - os.sep
- os.linesep
- os.pathsep
- os.curdir
- os.pardir
- os.cpu.count()
文件(夹)操作
- os.remove(path, *, dir_fd=None)
- 移除path对应的 文件
- 若path为文件夹, 会抛出异常
OSError
- os.rmdir(path, *, dir_fd=None)
- 移除path对应的 文件夹
- Only works when the directory is empty, otherwise, OSError is raised.
- os.mkdir(path, mode=0o777, *, dir_fd=None)
- 创建path对应的 文件夹
- If the directory already exists,
FileExistsError
is raised.
- os.removedirs(name)
- 递归删除文件夹
- For example, os.removedirs(‘foo/bar/baz’) will first remove the directory ‘foo/bar/baz’, and then remove ‘foo/bar’ and ‘foo’ if they are empty. Raises
OSError
if the leaf directory could not be successfully removed
- os.makedirs(name, mode=0o777, exist_ok=False)
- 递归创建文件夹
- If
exist_ok
is False (the default), an OSError
is raised if the target directory already exists. - Note
makedirs()
will become confused if the path elements to create include pardir (eg. “…” on UNIX systems).
- os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
- 将文件(夹)的名字从
src
改为dst
- 只能对相应的文件进行重命名, 不能重命名文件的上级目录名
- If dst is a directory,
OSError
will be raised. 如果src
参数对应文件或目录不存在, 以及如果dst
参数对应文件或目录已经存在,都会报错 - If you want cross-platform overwriting of the destination, use
replace()
.
- os.renames(old, new)
- 递归重命名文件(文件夹)
- 既可以重命名文件, 也可以重命名文件的上级目录名
- Note This function can fail with the new directory structure made if you lack permissions needed to remove the leaf directory or file.
路径获取
- os.getcwd()
- os.listdir(path=’.’)
- os.scandir(path=’.’)
- os.walk(top, topdown=True, None, followlinks=False)
有目录:
os.path
路径显示
- os.path.abspath(path)
- 返回path对应的绝对路径
- os.path.commonpath(paths)
- os.path.commonprefix(list)
- os.path.dirname(path)
- 返回path对应的倒数第二级目录
- os.path.exists(path)
路径判断
- os.path.expanduser(path)
- 替换path中的
~
为用户目录(HOME)实际值
- os.path.expandvars(path)
- 替换$name or ${name}为environment variable name对应的实际值
路径时间
- os.path.getatime(path)
- 返回最后一次访问path的时间
- os.path.getmtime(path)
- 返回最后一次修改path的时间
- os.path.getctime(path)
- 返回path对应的的ctime
- 在某些系统(如Unix)上是最后一次元数据更改的时间,而在其他系统(如Windows)上则是路径的创建时间
路径体积
- os.path.getsize(path)
- 返回path对应的体积
路径规范
- os.path.isabs(path)
- path是否为绝对路径
- os.path.isfile(path)
- os.path.isdir(path)
- os.path.islink(path)
- 如名
- os.path.join(path, *paths)
- 使用系统对应的分隔符拼接路径
- 对于Windows: Note that since there is a current directory for each drive,
os.path.join("c:", "foo")
represents a path relative to the current directory on drive C: (c:foo)
, not c:\foo
.
- os.path.normcase(path)
- 规范化路径名的大小写。
- 在Unix和Mac OS X上,这将返回路径不变; 在不区分大小写的文件系统上,它将路径转换为小写。在Windows上,它还将正斜杠转换为反斜杠。
- os.path.normpath(path)
- 通过折叠冗余分隔符和上级引用来规范化路径名,以便
A//B
,A/B/
,A/./B
和A/foo/../B
都变为A/B
. - 此字符串操作可能会更改包含符号链接的路径的含义
- 在Windows上,它将正斜杠转换为反斜杠
- 要规范化大小写,请使用
normcase()
- os.path.realpath(path)
- 返回指定文件名的规范路径,消除路径中遇到的任何符号链接(如果操作系统支持它们)
- os.path.samefile(path1, path2)
- 如果两个路径名参数都引用相同的文件或目录,则返回True
- os.path.sameopenfile(fp1, fp2)
- 如果文件描述符fp1和fp2引用同一文件,则返回True
- os.path.split(path)
- 将路径名路径拆分为一对
(head, tail)
,其中tail是最后一个路径名组件,head是指向该路径的所有内容, tail永远不会有斜线; 如果path以斜线结尾,则tail将为空; 如果路径中没有斜杠,则head将为空 - 如果
path
为空,则head和tail都为空 - 尾部斜杠从head剥离,除非它是root(仅一个或多个斜杠)
- 在所有情况下,
join(head, tail)
返回与path相同位置的路径(但字符串可能不同).
- os.path.splitdrive(path)
- 将路径名路径拆分为一对
(drive, tail)
,其中drive是挂载点或空字符串. 在不使用驱动器规格的系统上,drive将始终为空字符串 - 在所有情况下,
drive + tail
将与path
相同。
- os.path.splitext(path)
- 将路径名路径拆分为一对
(root, ext)
, 使得root + ext == path
,ext为空或以.
开头,最多包含一个句点. basename
的前导.
被忽略 -
splitext('.cshrc')
返回('.cshrc','')
。
- os.path.supports_unicode_filenames
- 如果可以将任意Unicode字符串用作文件名(在文件系统强加的限制内),则为True。
glob
glob模块根据Unix shell使用的规则查找与指定模式匹配的所有路径名,尽管结果以任意顺序返回。
实现了:
-
*
表示匹配0到多个字符 -
?
表示匹配一个字符 - 用
[]
表示匹配括号里表示的字符范围
-
[exp]
匹配指定范围内的字符,如:[1-9]
匹配1至9范围内的字符, 破折號(-)表示一個範圍, 上面的範圍也可直接用[0123456789]來表示 -
[!exp]
匹配不在指定范围内的字符 - 对于文字匹配,将元字符包装在括号中。例如,
'[?]'
匹配字符'?'
glob中模式規則不是正則表達式, 而是, 符合標準Uinx路徑擴展規則. 但是Shell變量名和符號(~)是不被擴充的, 只有一些特殊的字符: 兩個不同的通配符和字母範圍被支持(见上). 对于~
符和shell变量扩展,请使用os.path.expanduser()
和os.path.expandvars(0)
. 模塊規則適合於文檔名的片段(以/為分隔, 也就是只能匹配/
与/
之间的文本), 但模式中的路徑可以是相對或者絕對路徑.
这是通过一致地使用os.scandir()
和fnmatch.fnmatch()
函数来完成的,而不是通过实际调用子shell。请注意,与fnmatch.fnmatch()
不同,glob将以点(.)
开头的文件名视为特殊情况, 通配符不会进行匹配. 可见后面的例子.
- glob.glob(pathname, *, recursive=False)
- 返回可能为空的(无序的, 可以借助
sorted()
排序)匹配路径名字列表, 这个pathname
必须是包含路径规范的字符串 - 如果
recursive
为true
,则模式**
将匹配任何文件以及零个或多个目录和子目录, 如果模式后跟os.sep
,则只有目录和子目录匹配 - 注意在大型目录树中使用
**
模式可能会消耗过多的时间。
- glob.iglob(pathname, *, recursive=False)
- 功能同上, 只是返回一个迭代器, 避免了同时的大量存储
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
:
- glob.escape(pathname)
- 轉義所有的特殊字符(’?’,’*‘和’[’])
- 如果想匹配任意可能包含特殊字符的字符串,這將非常有用。drive/UNC的sharepoints中的特殊字符不會轉義,例如在Windows系統上
escape('//?/c:/Quo vadis?.txt')
將返回'//?/c:/Quo vadis[?].txt'
. - 每個特殊字符通過構建包含單個條目的字符範圍來轉義, 例如,
[?]
便是字符?
的转义
fnmatch
此模块提供对Unix shell样式通配符的支持,这些通配符与正则表达式(在re模块中记录)不同。shell样式通配符中使用的特殊字符是:
-
*
表示匹配0到多个字符 -
?
表示匹配一个字符 - 用
[]
表示匹配括号里表示的字符范围
-
[exp]
匹配指定范围内的字符,如:[1-9]
匹配1至9范围内的字符, 破折號(-)表示一個範圍, 上面的範圍也可直接用[0123456789]來表示 -
[!exp]
匹配不在指定范围内的字符 - 对于文字匹配,将元字符包装在括号中。例如,
'[?]'
匹配字符'?'
请注意:
- 文件名分隔符(Unix上的
/
)对于此模块并不是特殊字符。与glob
模块略有不同 - 同样,以
.
开头的文件名对于此模块并不是特殊字符,并且可用*
和?
匹配
主要的方法:
- fnmatch.fnmatch(filename, pattern)
- 测试是否filename字符串可以匹配模式pattern, 返回True或False
- 这两个参数都使用
os.path.normcase()
进行大小写规范化。fnmatchcase()
可用于执行区分大小写的比较,无论这是否是操作系统的标准。
- fnmatch.fnmatchcase(filename, pattern)
- 比较区分大小写,不使用
os.path.normcase()
。
- fnmatch.filter(names, pattern)
- 返回与pattern匹配的名称列表的子集。它与
[n for n in names if fnmatch(n, pattern)]
相同,但实现更有效。
- fnmatch.translate(pattern)
- 返回转换为正则表达式的shell样式模式,以便与
re.match()
一起使用。
对于目录:
从下面的测试可以看出来, 实际上, glob
应该更为常用一些, fnmatch
模块不会忽略.
开头的文件(夹), 这有时候会造成不必要的麻烦, 因大多数时候, 是不会需要搜索这些文件夹的.
参考链接
- Python glob.md: https://hk.saowen.com/a/83de58e8a7e060d8ace69c912cbd209948d6c4fe533aa2746201d96a1b45a8bf
- Python 3.7标准库文档: https://docs.python.org/3/library/index.html