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)       #輸出。<class 'str'> /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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM