Python中路径操作
1. os.path模块
3.4版本之前使用os.path模块,3.4版本之后建议使用pathlib模块
方法 | 解释 |
---|---|
path.join | 拼接一个路径出来 |
path.exists | 判断该路径是否存在 |
path.split | 将路径切割成头和尾的一个元组 |
path.abspath | 返回一个绝对路径 |
path.dirname | 返回‘目录’ |
path.basename | 返回路径的最后一部分 |
>>> from os import path
>>> p = path.join(\'/usr\',\'local/httpd/httpd.conf\')
>>> p
\'/usr/local/httpd/httpd.conf\'
>>> type(p)
<class \'str\'>
>>> path.dirname(p)
\'/usr/local/httpd\'
>>> path.basename(p)
\'httpd.conf\'
>>> path.split(p)
(\'/usr/local/httpd\', \'httpd.conf\')
>>> p
\'/etc/local/http/httpd.conf\'
>>> while p != path.dirname(p):
... p = path.dirname(p)
... print(p,path.basename(p))
...
/etc/local/http http
/etc/local local
/etc etc
/
2. pathlib模块
from pathlib import Path
Path中返回的是一个Path对象,而os.path中返回的是一个字符串。
2.1 目录操作
初始化:
>>> p = Path() # 当前目录
>>> p = Path(\'a\',\'b\',\'c/d\') # 当前目录下的a/b/c/d
>>> p = Path(\'/etc\') # 根下的etc目录
属性 | 解释 |
---|---|
parts | 返回路径中的每一个部分 |
joinpath | 连接多个字符串到Path对象中 |
parent | 目录的逻辑父目录 |
parents | 父目录序列,索引0是直接的父 |
name | 目录中的最后一部分 |
suffix | 目录中的最后一部分的扩展名 |
stem | 目录的最后一个部分,没有后缀 |
suffixes | 返回多个扩展名列表 |
with_suffix(suffix) | 补充扩展名到路径的尾部,返回新的路径,扩展名存在则无效 |
with_name(name) | 替换目录最后一个部分并返回一个新的路径 |
>>> p = Path(\'/usr/local/httpd/httpd.conf\')
>>> p.name
\'httpd.conf\'
>>> p.stem
\'httpd\'
>>> p.suffix
\'.conf\'
>>> p.with_name(\'httpd.txt\')
PosixPath(\'/usr/local/httpd/httpd.txt\')
属性 | 解释 |
---|---|
cwd() | 返回当前工作目录 |
home() | 返回当前家目录 |
is_dir() | 是否是目录 |
is_file() | 是否是普通文件 |
is_symlink() | 是否是软链接 |
is_socket() | 是否是socket文件 |
is_block_device() | 是否是块设备 |
is_absolute() | 是否是绝对路径 |
resolve() | 返回一个新的路径,该路径是当前Path的绝对路径,如果是软连接则被解析 |
absolute() | 获取绝对路径,推荐使用resolve() |
exists() | 目录或者文件是否存在 |
rmdir() | 删除空目录,没有提供判断目录为空的方法 |
touch() | 创建一个文件 |
as_uri() | 将路径解析成url |
mkdir() | 创建目录 |
判断目录: |
>>> Path.cwd()
PosixPath(\'/home/yanfa\')
>>> Path.home()
PosixPath(\'/home/yanfa\')
>>> p = Path(\'/home/yanfa\')
>>> p
PosixPath(\'/home/yanfa\')
>>> p.is_dir()
True
>>> p.is_file()
False
>>> p.is_absolute()
True
创建目录:
>>> p = Path()
>>> p /= \'a/b/c/d\'
>>> p.exists()
False
>>> p.mkdir() # FileNotFoundError
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/python3.6/lib/python3.6/pathlib.py", line 1248, in mkdir
self._accessor.mkdir(self, mode)
File "/usr/local/python3.6/lib/python3.6/pathlib.py", line 387, in wrapped
return strfunc(str(pathobj), *args)
FileNotFoundError: [Errno 2] No such file or directory: \'a/b/c/d\'
>>> p.mkdir(parents=True)
>>> p.exists()
True
通配符匹配:
- glob(pattern) 匹配给定的模式
- rglob(pattern) 匹配给定的模式,递归目录,返回一个生成器
- match(pattern) 模式匹配,成功返回True
>>> p = Path()
>>> list(p.glob(\'h*\'))
[PosixPath(\'h\'), PosixPath(\'hello\')]
>>> list(p.glob(\'**/*.py\'))
[PosixPath(\'pass_py.py\')]
>>> g = p.rglob(\'*.py\')
>>> next(g)
PosixPath(\'pass_py.py\')
>>> next(g)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> p = Path(\'a/b/c/d\')
>>> p = Path(\'a/b/c/ddd.py\')
>>> p.match(\'d*.py\')
True
>>> p.match(\'c/d*.py\')
True
>>> p.match(\'b/*/d*.py\')
True
查看文件或者目录属性信息
- stat() 如同linux里面的stat命令
- lstst() 同stat(),但是如果是符号链接,就显示链接本身的信息
2.2 文件操作
-
open(mode=\'r\', buffering=-1, encoding=None, errors=None, newline=None
如何内建的open,返回一个文件对象。 - read_bytes() 以\’rb\’读取路径中对应的文件,并返回二进制流。
- read_text() 以\’rt\’读取路径中对应的文件,并返回文本。
- write_bytes(date) 以‘wb’方式写入数据到路径对应文件。
- write_text(data) 以‘wt’方式写入数据到路径对应的文件。
>>> from pathlib import Path
>>> p = Path(\'hello\')
>>> p.write_text(\'hello python\')
12
>>> p.read_text()
\'hello python\'
>>> with p.open() as f:
... print(f.read())
...
hello python
3. shutil模块
3.1 os模块
- os.name 返回操作系统
- os.uname() 显示当前操作系统的详细信息
- sys.platform 返回当前操作系统
- os.listdir() 返回目录内容的列表
- os.stat() 如何stat
- os.chmod() 修改文件的权限
- os.chown() 改变文件的属主,属组
3.2 shutil模块
shutil模块提供了对文件的高级操作,特别是针对文件的复制和移动。
- copyfileobj(fsrc, fdst[, length]) 文件对象的复制,复制内容。
- copyfile(src, dst, *, follow_symlinks=True) 复制文件内容,不含元数据
- copymode() 仅仅复制权限
- copystat() 复制元数据,stat包含权限
- copy() 复制文件内容、权限和部分元数据,不包括创建时间和修改时间
- rmtree() 递归删除,同
rm -rf
一样 - move(src,dst,copy_function=copy2) 递归移动文件,目录到目录路径。
版权声明:本文为dianel原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。