python中pathlib模块处理文件路径


python3.4- 之前路径相关的操作都放在 os中, 基本集中在 o.path

os(os.path)pathlib 的对比

os and os.path pathlib
os.path.abspath Path.resolve
os.chmod Path.chmod
os.mkdir Path.mkdir
os.rename Path.rename
os.replace Path.replace
os.rmdir Path.rmdir
os.remove, os.unlink Path.unlink
os.getcwd Path.cwd
os.path.exists Path.exists
os.path.expanduser Path.expanduser and Path.home
os.path.isdir Path.is_dir
os.path.isfile Path.is_file
os.path.islink Path.is_symlink
os.stat Path.stat, Path.owner, Path.group
os.path.isabs PurePath.is_absolute
os.path.join PurePath.joinpath
os.path.basename PurePath.name
os.path.dirname PurePath.parent
os.path.samefile Path.samefile
os.path.splitext PurePath.suffix
import os
from pathlib import Path

print(os.path.abspath(__file__))
print(Path(__file__).resolve())


print(os.path.isdir(os.getcwd()))
print(Path.cwd().is_dir())

print(os.path.basename(os.path.abspath(__file__)))
print(Path(__file__).resolve().name)



python中pathlib模块处理文件路径

py3.6 +

之前的文件处理都是使用 os + os.path


#  修改文件后缀


base_dir = os.path.dirname(os.path.abspath(__file__))


1 
import os, sys

for filename in  os.listdir(base_dir):
     base_name, ext = os.path.splitext(filename)
     if ext == '.txt':
        os.rename(filename, os.path.join(path, f'{basename}.csv'))
         
     
2 

from pathlib import Path

for fpath in Path(base_dir).glob('*.txt'):
    fpath.rename(fpath.with_suffix('.csv'))




#  组合文件路径


1) 
path_ = os.path.join(base_dir, 'foo.txt')

2) 
path__ = Path(base_dir) / 'foo.txt'



#  读取文件内容

1 with open('foo.txt', encoding='utf-8') as file:
       print(file.read())

2 print(Path('foo.txt').read_text(encoding='utf-8'))


/ 用来拼接 路径 vs os.path.join


import os
from pathlib import Path

p = os.path.join("home", "your/code")

p2 = Path("/").joinpath("home", "your/code") # /home/your/code

p3 = "/" / Path("home") / Path("your/code")
p1 = Path("home") / Path("your/code")
p3 = Path("/") / Path("home") / Path("your/code")


print(p3)

文件的前后缀 suffix/stem

Path().suffix
Path().stem

import os
from pathlib import Path

base = os.path.basename(os.path.abspath(__file__))
stem, suffix = os.path.splitext(base)
print(stem, suffix  )



base = Path(__file__).resolve()
print(base.suffix, base.stem)


# 当文件有多个后缀,可以用suffixes返回文件所有后缀列表:


Path('my.tar.bz2').suffixes
['.tar', '.bz2']

其他的使用方法

touch 方法

Path().touch()

Python 语言没有内置创建文件的方法 (linux 下的 touch 命令)

# 过去需要使用文件句柄操作
with open('new.txt', 'a') as f:
    ...
    
# 可以直接使用 Path
Path('new.txt').touch()

touch 接受mode参数,能够在创建时确认文件权限, 还能通过exist_ok参数方式确认是否可以重复 touch (默认可以重复创建,会更新文件的 mtime)

home 获取用户的 home 目录

Path.home()

os.path.expanduser('~')

Path.home()

owner 获取当前文件的用户 *nux系统


import pwd
pwd.getpwuid(os.stat('/usr/local/etc/my.cnf').st_uid).pw_name


p.owner()

创建多级目录 Path().mkdir(parents=True)


Path('1/2/3').mkdir(parents=True)

https://www.dongwm.com/post/use-pathlib/

Buy me a 肥仔水!