pathlib:处理文件路径的瑞士军刀
pathlib是python3.4中引入的模块,专门用来处理路径的。个人觉得这是一个非常非常强大的模块,可以说是处理路径的一把瑞士军刀,下面我们就来看看它的功能。
在pathlib中有一个Path这个类,我们所做的所有操作都是基于这个类来的。
Path的实例对象
from pathlib import Path
path = Path(r"c:\python37\lib\site-packages\tornado")
print(path) # c:\python37\lib\site-packages\tornado
print(type(path)) # <class 'pathlib.WindowsPath'>
"""
可以看到打印的时候,和普通字符串输出是一样的,但是类型是<class 'pathlib.WindowsPath'>
如果是在linux下则是<class 'pathlib.PosixPath'>
"""
操作路径
from pathlib import Path
path = Path(r"c:\python37\lib\site-packages\tornado")
# 如果我要找到c:\python37\lib\site-packages\flask怎么做呢?
# 使用os的话,os.path.join(os.path.dirname(os.path.abspath(r'c:\python37\lib\site-packages\tornado')), 'flask')
# 使用os的话,会很长,但是使用path会很简单
# 我们调用path.parent等于回到路径的上一层,注意:得到的还是Path对象
# 这就意味着我们可以不断的使用parent
print(path.parent) # c:\python37\lib\site-packages
# 我们也可以对path使用join的模式
print(path.parent.joinpath("flask")) # c:\python37\lib\site-packages\flask
# 除此之外,还有更简单的办法
print(path.parent / 'flask') # c:\python37\lib\site-packages\flask
print(path.parent.parent.parent / 'scripts' / "pip.exe") # c:\python37\scripts\pip.exe
"""
怎么样呢?是不是很方便呢?
只不过得到的都是Path对象,如果需要当成普通的字符串来使用的话,还需要使用str转化一下。
"""
相关操作
from pathlib import Path
path = Path(r"c:\python37\lib\asyncio\__init__.py")
# Path在拼接路径的时候,即使路径不存在也是可以的。只是单纯的当成普通字符串来处理
# 但是当输入存在的路径的时候,我们还可以进行处理
# 1.打印当前的path的绝对路径
print(path.absolute()) # c:\python37\lib\asyncio\__init__.py
# 2.Windows下的话,打印根目录,个人觉得没啥卵用
print(path.anchor) # c:\
# 3.转化为unix的路径,个人觉得没啥卵用
print(path.as_posix()) # c:/python37/lib/asyncio/__init__.py
# 4.转化成文件模式的路径,注意:在pycharm点击是可以直接跳转的
print(path.as_uri()) # file:///c:/python37/lib/asyncio/__init__.py
# 5.改变文件权限,在Windows下无卵用
# path.chmod(755)
# 6.打印文件的工作区,也就是所在目录。相当于path.parent
print(path.cwd()) # D:\koishi
# 7.Windows下打印所在盘符
print(path.drive) # c:
# 8.打印文件所在的组,Windows下会报错,只在POSIX下有用
# print(path.group())
# 9.打印家目录,这个功能和传入Path里面的路径没太大关系
print(path.home()) # C:\Users\satori
# 10.判断当前路径是否是绝对路径
print(path.is_absolute()) # True
# 11.判断是否是目录
print(path.is_dir()) # False
# 12.判断是否是文件
print(path.is_file()) # True
# 13.判断是否存在
print(path.exists()) # True
# 14.打印文件名
print(path.name) # __init__.py
# 15.文件的所有者,Windows不支持
# print(path.owner())
# 16.将路径进行肢解(好残忍,(゚Д゚))
print(path.parts) # ('c:\\', 'python37', 'lib', 'asyncio', '__init__.py')
# 17.给文件重命名
# print(path.rename("new_name")) # 这里不改了,因为是python的内置模块
# 18.查看文件属性,等同于os.stat("path")
print(path.stat().st_size) # 1212
# 19.不要后缀名
print(path.stem) # __init__
# 20.打印后缀名
print(path.suffix) # .py
# 21.以字节的形式读取
# print(path.read_bytes())
"""
def read_bytes(self):
with self.open(mode='rb') as f:
return f.read()
"""
# 22.以文本形式读取
# print(path.read_text())
"""
def read_text(self, encoding=None, errors=None):
with self.open(mode='r', encoding=encoding, errors=errors) as f:
return f.read()
"""
# 23.以字节形式写入
# path.write_bytes()
"""
def write_bytes(self, data):
view = memoryview(data)
with self.open(mode='wb') as f:
return f.write(view)
"""
# 24.以文本形式写入
# path.write_text()
"""
def write_text(self, data, encoding=None, errors=None):
if not isinstance(data, str):
raise TypeError('data must be str, not %s' %
data.__class__.__name__)
with self.open(mode='w', encoding=encoding, errors=errors) as f:
return f.write(data)
"""
# 可以看到read_bytes,read_text,write_bytes,write_text底层都是调用了open方法
# 25.遍历文件
path = Path(r"c:\python37\lib\site-packages\pandas")
# 找到所有以.py结尾的文件
for p in path.glob("*.py"):
print(p)
r"""
c:\python37\lib\site-packages\pandas\conftest.py
c:\python37\lib\site-packages\pandas\testing.py
c:\python37\lib\site-packages\pandas\_version.py
c:\python37\lib\site-packages\pandas\__init__.py
"""
# 26.递归遍历文件
for p in path.rglob("???.py"):
# 找到文件名是3个字符加上.py的文件
# 注意:glob和rglob匹配的时候,是按照文件名匹配的。
# 但是遍历得到的是包含文件所在路径的,换句话说会将Path里面的路径和其里面符合匹配格式的文件组合起来。
print(p)
r"""
c:\python37\lib\site-packages\pandas\core\api.py
c:\python37\lib\site-packages\pandas\core\ops.py
c:\python37\lib\site-packages\pandas\core\computation\api.py
c:\python37\lib\site-packages\pandas\core\computation\ops.py
c:\python37\lib\site-packages\pandas\core\dtypes\api.py
c:\python37\lib\site-packages\pandas\core\groupby\ops.py
c:\python37\lib\site-packages\pandas\core\indexes\api.py
c:\python37\lib\site-packages\pandas\core\reshape\api.py
c:\python37\lib\site-packages\pandas\core\sparse\api.py
c:\python37\lib\site-packages\pandas\io\api.py
c:\python37\lib\site-packages\pandas\io\gbq.py
c:\python37\lib\site-packages\pandas\io\gcs.py
c:\python37\lib\site-packages\pandas\io\sql.py
c:\python37\lib\site-packages\pandas\io\formats\css.py
c:\python37\lib\site-packages\pandas\tests\extension\base\ops.py
c:\python37\lib\site-packages\pandas\tseries\api.py
"""
以上是关于pathlib的介绍,尽管Path有很多种,WindowsPath,PosixPath,PurePath,但是我们操作的时候操作Path这个类即可,会自动帮我们选择符合平台的Path。Path类的属性并没有全部介绍完,因为很多不是很常用。并且我觉得最重要的还是对路径的处理,其他的都是对一些底层模块的封装。
关于Path类的所有属性如下,感兴趣的话,可以看源码继续深入研究一下
for attr in dir(Path):
if not attr.startswith("_"):
print(attr)
"""
absolute
anchor
as_posix
as_uri
chmod
cwd
drive
exists
expanduser
glob
group
home
is_absolute
is_block_device
is_char_device
is_dir
is_fifo
is_file
is_mount
is_reserved
is_socket
is_symlink
iterdir
joinpath
lchmod
lstat
match
mkdir
name
open
owner
parent
parents
parts
read_bytes
read_text
relative_to
rename
replace
resolve
rglob
rmdir
root
samefile
stat
stem
suffix
suffixes
symlink_to
touch
unlink
with_name
with_suffix
write_bytes
write_text
"""
pathlib:处理文件路径的瑞士军刀的更多相关文章
- 第十九章 Python os模块,pathlib 判断文件是目录还是文件
OS模块 os.path.abspath() :返回path规范化的绝对路径 import sys import os BASE_DIR = os.path.dirname(os.path.dirna ...
- filepath:处理文件路径的一把好手
1.ToSlash(path string) string 将相关平台的路径分隔符转为/ package main import ( "fmt" "os" &q ...
- Oracle数据库文件路径变更
环境:RHEL 6.4 + Oracle 11.2.0.3 情景一:只是部分普通数据文件迁移,可以在线操作. 1.将对应表空间offline,移动数据文件到新路径 2.数据文件alter databa ...
- Excel公式 提取文件路径后缀
我们在代码中获取一个文件路径的后缀,是一个很简单的事. 如C#中,可以通过new FileInfo(filePath).Extension,或者Path.GetExtension(filePath)获 ...
- IISExpress Log 文件路径
问题 用VS做开发时经常用IISExpress测试web程序,那么在测试过程中生成的Log文件放在哪里了? 答案 情况1 默认情况下 applicationhost.config 文中定义了连个日志文 ...
- [LeetCode] Longest Absolute File Path 最长的绝对文件路径
Suppose we abstract our file system by a string in the following manner: The string "dir\n\tsub ...
- 使用powershell批量添加Keil和IAR的头文件路径
在Keil和IAR的工程中,为了使文件结构清晰,通常会设置很多的子文件夹,然后将头文件和源文件放在不同的子文件夹中,这样就需要手动添加这些头文件夹的路径.当工程结构非常复杂时,文件夹的数量就非常多,特 ...
- Yii2:避免文件路径暴漏,代理访问文件
制作背景:公司要做第三方文件管理系统,客户有时候需要直接访问文件,但是我们又不想暴露文件路径,才有这代理访问 基本功能介绍:读取txt文档.读取图片,如果有需要,可以通过插件读取doc.pdf文档, ...
- php glob()函数实现目录文件遍历与寻找与模式匹配的文件路径
采用PHP函数glob实现寻找与模式匹配的文件路径,主要讨论glob()函数的作用和用法,利用glob函数读取目录比其它的要快N倍,因为glob函数是内置函数处理起来自然要快. 一,函数原型 arra ...
随机推荐
- LVS负载均衡(LVS简介、三种工作模式、十种调度算法)
一.LVS简介 LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中.该项目在Linux内核中实现 ...
- Centos7.4 yum 安装MariaDB
#系统及版本选择:https://downloads.mariadb.org/mariadb/repositories/#mirror=tunavim /etc/yum.repos.d/MariaDB ...
- CSV Data Set Config参数说明
以下是CSV Data Set Config各个参数的简要说明: FileName:即同目录下csv文件的名称 File Encoding: 默认为ANSI Varible Names: 定义文本文件 ...
- SD相关号码范围IMG设定
一.定义项目建议的号码范围——OVZA.VN01 二.免费货物的号码范围——WC07 三.定义销售文件的号码范围——VN01 四.金额契约产品建议模组的号码范围——WSN1 五.定义出口.进口的号码范 ...
- linux常用命令(18)find exec
find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了.-exec 参数后面跟的是command命令,它的终止是以 ...
- 几种排序算法及Java实现排序的几种方式
几种排序算法 下面的例子介绍了4种排序方法: 冒泡排序, 选择排序, 插入排序, 快速排序 package date201709.date20170915; public class SortUtil ...
- 嵌入式【杂记--手机芯片与pc】
手机.身边的移动设备大多数是嵌入式计算机,pc也是计算机,只是功耗上很大. 手机所采用的大多数芯片是英国ARM公司的架构coretom A系列 core, Intel公司采用自己的架构设计的芯片适用于 ...
- 【HANA系列】【第五篇】SAP HANA XS的JavaScript API详解
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列][第五篇]SAP HANA XS ...
- 调用redis封装好的JedisUtils接口实现锁库
1.在进行数据库操作的方法前先定义一个key值,并添加一个能区别每个key的标识 2.首先判断如果定义的key值存在的话,就直接return方法,如果不存在的话,就把key值放在jedisutil中, ...
- 云计算Openstack介绍(1)
一.云计算的前世今生 所有的新事物都不是突然冒出来的,都有前世和今生.云计算也是IT技术不断发展的产物. 要理解云计算,需要对IT系统架构的发展过程有所认识. 请看下 IT系统架构的发展到目前为止大致 ...