python abspath 软连接_Python中os和pathlib的使用

一、pathlib

1、路径操作模块

2、3.4版本之前:

Os.path

3、基本操作:

from os import path

p = path.join('/etc','sysconfig','netwoek')

print(type(p),p)       #输出。 /etc/sysconfig/netwoek

print(path.exists(p))     #  路径存在与否。False

print(path.split(p))      #输出('/etc/sysconfig', 'netwoek')

print(path.abspath('.'))      #输出/home/python/wcl/projects/web

等价于path.abspath(‘ ’)

print(path.dirname(p))     #/etc/sysconfig

print(path.basename(p))  #netwoek

print(path.splitdrive(p))   #('', '/etc/sysconfig/netwoek')

##

from os import path

p1 = path.abspath(__file__)

print(p1,path.basename(p1))

while p1 != path.dirname(p1):

p1 = path.dirname(p1)

print(p1,path.basename(p1))

4、3.4版本开始

建议使用pathlib模块,提供path对象来操作,包括目录和文件。

5、pathlib模块

From pathlib import Path

6、目录操作

初始化:from pathlib import Path

p =Path()     #输出格式。PosixPath('.')

p =Path('a','b','c/d')  #输出格式PosixPath('a/b/c/d')

p =Path('/etc')    #PosixPath('/etc')

7、路径拼接和分解

1)操作符/

Path 对象/Path对象

Path 对象/字符串或者 字符串/Path对象

2)分解

Parts属性,可以返回路径中的每一个部分

3)Joinpath

Joinpath(*other)

#代码块

p = Path()

p = p/'a'     #PosixPath('a')

p1 = 'b'/p       #PosixPath('b/a')

p2 = Path('c')      #PosixPath('c')

p3 = p2 /p1         #PosixPath('c/b/a')

print(p3.parts)      #('c', 'b', 'a')

p3.joinpath('etc','int.d',Path('.httpd'))

#PosixPath('c/b/a/etc/int.d/.httpd')

4)获取路径

Str获取路径字符串。

Bytes获取路径字符串的bytes

p = Path('/etc')     #

print(str(p),bytes(p))

##/etc b'/etc'

5)父目录

Parent目录的逻辑就是父目录

Parents 父目录序列,索引0就是直接的父

取直接的父目录:p.parents[2]   p.parent

取到根目录:

p = Path('/a/b/c/d')

print(p.parent.parent)

p.absolute().parents[len(p.absolute().parents)-1]

print(len(p.absolute().parents))

p = Path('/a/b/c/d')

print(p.parent.parent)

for x in p.parents:

print(x)

#/a/b

/a/b/c

/a/b

/a

/

6)name  stem  suffix  suffixes  with_suffix(suffix)  with_name(name)

(1)name目录的最后一个部分

(2)Suffix目录中最后一个部分的拓展名

(3)Stem目录最后一个部分,没有后缀。

(4)Suffixes  返回多个扩展名列表。

(5)With_suffix(suffix)补充扩展名到路径尾部,返回新的路径,扩展名存在则无效。

(6)With_name(name)替换目录最后一个部分并返回一个新的路径。

p = Path('/etc/config/system/cf.config.gz')

print(p.name)     #cf.config.gz

print(p.suffix)      #.gz

print(p.suffixes)    #['.config', '.gz']

print(p.stem)    #cf.config

print(p.with_name('cf.config'))    #/etc/config/system/cf.config

#代码:

p1 = Path('README')

print(p.with_suffix('.txt'))

#输出:/etc/config/system/cf.config.txt

(7)cwd()返回当前工作目录

(8)Home()返回当前家目录

(9)is_dir()是否是目录,目录存在返回True.

(10)is_symlink()是否是软连接

(11)is_file()是否是普通文件,文件存在返回True

(12)is_socket()是否是socket文件

(13)is_block)device()是否是块设备。

(14)is_char_device()是否是字符设备

(15)is_absolute()是否是绝对路径

(16)resolve()返回一个新的路径,这个新的路径就是当前Path的绝对路径,如果是软连接则直接被解析

(17)absolute()也可以获取绝对路径,但是推荐使用resolve()

(18)exists()目录或文件是否存在

(19)rmdir()删除空目录,没有提供判断目录为空的方法。

(20)touch(mode=0o666,exist_ok=True)创建一个文件

(21)as_uri()将文件路径返回URI。

(22)mkdir(mode=0o777,parents=False,exist_ok=False)

(23)Parents,是否创建父目录,True等同于mkdir-p:False时,父目录不存在,则抛出fileNotfounderror。

(24)exist_ok参数,在3.5版本加入,flase时路径存在,抛出异常,True时候异常被忽略。

(25)Iterdir()

迭代当前目录:

P = Path()

p = Path()

p /= 'a/b/c/d'

p.exists()

p = Path()

p /='a/b/c/d'

p.exists()

p.mkdir()

p.mkdir(parents=True)

p.exists()

p.mkdir(parents=True)

p.mkdir(parents=True,exist_ok=True)

p /='readme.txt'

p.parent.rmdir()

p.aprent.exists()

p.mkdir()

p.mkdir(marents=True)

for x in p.parents[len(p.parents)-1].iterdir():

print(x,end='\t')

if x.is_dir():

flag = False

for _ in x.iterdir():

flag = True

break

print('dir','Not Empty' if flag else 'Empyt',sep='\t')

elif x.is_file():

print('file')

else:

print('other file')

操作符/

7)通配符:glob(pattern)

通配给定的模式。

rglob(pattern)通配给定的模式,递归目录。

返回一个生成器;

list(p.glob('test')) #返回当前目录对象下的test开头的文件

list(p.glob('**/*.py'))#递归所有目录,等同于rglob

g = p.rglob('*.py')  #生成器

next(g)

8)匹配:match(pattern)

**任意一级,通配符。

模式匹配,成功返回True。

Path('a/b.py').math('*.py')  #True

Path('/a/b/c.py').math('b/*.py')#True

Path('/a/b/c.py').math('a/*.py') #False    因为a文件下找不到.Py文件

Path('/a/b/c.py').math('a/*/*.py')#True

Path('/a/b/c.py').math('a/**/*.py')#True

Path('/a/b/c.py').math('**/*.py')#True

9)Stat()相当于stat命令

lstat()同stat(),但如果是符号链接,则显示符号链接本身的文件信息

lstat()软连接命令,相当于软连接的。

##

from pathlib import Path

p = Path('test')

p.stat()

p1 = Path('t')

p1.stat()

p1.lstat()

10)文件操作

Open(mode=’r’,buffering=-1,encoding=None,errors=None,newline=None)

使用方法类似内建函数open,返回一个文件对象。

3.5增加的新函数

Read_bytes()

以’rb’读取路径相对文件,并返回二进制流。

Read_text(encoding=None,errors=None)

以’rt’ 方式读取路径对应文件,返回文本。

Path.write_bytes(data)

以’wb’方式写入数据到路径对应文件。

Write_text(data,encoding=None,errors=None)

以’wt’方式写入字符串到路径对应文件。

#p = Path('my_binary_file')

p.write_bytes(b'Binary file contents')

p.read_bytes()

#打印出b'Binary file contents'

#p = Path('my_text_file')

p.write_text('Text file contents')

p.read_text()

#打印出'Text file contents'

from pathlib import Path

p = Path('test.py')

p.write_text('hello python')

print(p.read_text())

with p.open()as f:

print(f.read(5))

##打印出hello python

hello

二、os模块

1、操作系统平台

属性方法

结果

Os.name

Windows是nt,,linux是posix

Os.uname()

*nix支持

Sys.platform

Windows显示win32,linux显示linux

Os.listdir(‘o:/tmp’)

Os也有open、read、write等方法,但是太低级,建议使用内建函数。

Ln -s

test t1建立一个软连接

Os.stat(path,*,dir_fd=None,follow_symlinks=True)

本质上调用的是linux的stat。

Path:路径的string或者byetes,或者fd文件描述符。

follow_symlinks

True 返回文本本身信息,False且如果是软连接则显示软连接的本身。

Os.chmod(path,mode,*,dir_fd=None,follow_syslinks=True)

Os.chmod(‘test’,0o777)

Os.chown(path,uid,gid)

改变文件的属组,属主,但是需要足够的权限。

2、shutil模块

到目前为止:文件拷贝:使用两个文件对象,源文件读取内容,写入目标文件中来完成拷贝过程。但是这样会丢失stat数据信息(权限等),复制的只是文件的内容,没办法复制权限等内容:

目录复制python提供了一个方便的库,shutil(高级文件操作)

3、Copy复制   权限和内容

1)Copyfileobj(fsrc,fdst[,length])

文件对象的复制,fsrc和fdst是open打开的文件对象,复制内容,fdst要求可写。Length指定表示了buffer的大小。

import shutil

src = 'test.txt'

dest = 'test1.txt'

with open(src) as f1:

with open(dest,'w+') as f2:

shutil.copyfileobj(f1,f2)

#不能完成copy,原因是指针移动了。

import  shutil

with open('test.txt','w+')as f1:

f1.write('abc\n123')

f1.flush()

with open('test1.txt','w+')as f2:

shutil.copyfileobj(f1,f2)

#改正代码

import  shutil

with open('test.txt','w+')as f1:

f1.write('abc\n123')

f1.flush()

f1.seek(0)

with open('test1.txt','w+')as f2:

shutil.copyfileobj(f1,f2)

总结:copyfile(src,dest,*,follow_symlinks=True)

复制文件内容,不含元数据,sc、dst为文件的路径字符串。

本质上就是调用copyfileobj,所以不带元数据二进制内容复制。

2)     copymode(src,dst,*,follow_symlinks=True)

仅仅复制的是权限。

shutil.copymode('test.txt','test1.txt')

##显示权限等信息。

import  shutil

import  os

with open('test.txt','w+')as f1:

f1.write('abc\n123')

f1.flush()

f1.seek(0)

with open('test1.txt','w+')as f2:

shutil.copyfileobj(f1,f2)

print(os.stat('test.txt'))

print(os.stat('test1.txt'))

##打印出;

os.stat_result(st_mode=33206, st_ino=42502721483335735, st_dev=4009623578, st_nlink=1, st_uid=0, st_gid=0, st_size=8, st_atime=1524639016, st_mtime=1524639778, st_ctime=1524639016)

os.stat_result(st_mode=33206, st_ino=1407374883584914, st_dev=4009623578, st_nlink=1, st_uid=0, st_gid=0, st_size=8, st_atime=1524639016, st_mtime=1524639778, st_ctime=1524639016)

3)copystat(src,dst,*,follow_symlinks=True)

##shutil.copystat(f1,f2)复制元数据,stat包括权限。

4)         总结。复制文件内容,权限和部分元数据,不包括创建时间和修改时间。本质上是调用。

copyfile(src, dst, follow_symlinks=follow_symlinks)

copymode(src, dst, follow_symlinks=follow_symlinks)

4、Copy2   stat 和内容

比copy多了复制全部元数据,需要平台的支持。

本质上调用了。

copyfile(src, dst, follow_symlinks=follow_symlinks)

copystat(src, dst, follow_symlinks=follow_symlinks)

5、Copytree   递归复制目录

Copytree(src,dst,symlinks=Flase,ignore=None,copy_function=copy2,ignore_dangling_symlinks=False).递归复制的目录,默认使用copy2,也就是带更多的元数据复制。

Src 、dst必须是目录,src必须存在,dst必须不存在,提供一个callable(src,names)-》ignore_names.提供一个函数,他就会被调用。Src是源目录,names是os.listdir(src)的结果,就是列出src中的文件名称,返回值是要被过滤的文件名的set类型。

Src  dst 必须为目录。

6、rm删除

Shutil.rmtree(path,ignore_errors=False,onerrors=None)

递归删除,如同rm-fd一样危险,慎用。

不是原子操作,有可能删除操作,就会中断,已经删除的就是已经删除了。

Ignore_error为True,忽略错误,当为False或者omitted时候oneerrors生效。

Oneerror刷为callable,接受函数function、path和execinfo。

Shutil.rmtree(‘test’)

7、move移动

Move(src,dst,copy_function=copy2)

递归移动文件、目录到目标,返回目标。本身使用的是os.rename方法。

如果不支持rename,如果是目录则想copytree在删除源目录。

默认使用copy2方法

Shutil还有打包功能,生成tar并压缩,支持,zip、gz、bz、xz。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值