python rpa_(RPA学习)Python 之 Pathlib 模块
原標(biāo)題:(RPA學(xué)習(xí))Python 之 Pathlib 模塊
藝賽旗 RPA9.0全新首發(fā)免費(fèi)下載 點(diǎn)擊下載
http://www.i-search.com.cn/index.html?from=line9
讀文件和寫文件
在我們使用 open 來操作文件讀寫操作的時候, 不僅可以使用字符串格式的路徑,對于 pathlib 生成的路徑完全可以直接使用:
path = pathlib.Path.cwd() / 'test.md'
with open(path, mode='r') as fid:
headers = [line.strip() for line in fid if line.startswith('#')]
print('\n'.join(headers))
或者在 pathlib 的基礎(chǔ)使用 open, 我推薦使用下面的方式:
import pathlib
DIR_PATH = pathlib.Path("/Users/chennan/CDM") / "2000" / "hehe.txt"
with DIR_PATH.open("r") as fs:
data = fs.read()
print(data)
這樣寫的好處就是 open 里面我們不需要再去傳入路徑了,直接指定文件讀寫模式即可。實際上這里的 open 方法,底層也是調(diào)用了 os.open 的方法。使用哪種方式看個人的喜好。
pathlib 還提供幾種文件的讀寫方式:
可以不用再使用 with open 的形式即可以進(jìn)行讀寫。
.read_text(): 找到對應(yīng)的路徑然后打開文件,讀成str格式。等同open操作文件的"r"格式。
.read_bytes(): 讀取字節(jié)流的方式。等同open操作文件的"rb"格式。
.write_text(): 文件的寫的操作,等同open操作文件的"w"格式。
.write_bytes(): 文件的寫的操作,等同open操作文件的"wb"格式。
使用 resolve 可以通過傳入文件名,來返回文件的完整路徑,使用方式如下
import pathlib
py_path =pathlib.Path("superdemo.py")
print(py_path.resolve())
輸出
/Users/chennan/pythonproject/demo/superdemo.py
需要注意的是 "superdemo.py" 文件要和我當(dāng)前的程序文件在同一級目錄。
選擇路徑的不同組成部分
pathlib 還提供了很多路徑操作的屬性,這些屬性可以選擇路徑的不用部位,如
.name: 可以獲取文件的名字,包含拓展名。
.parent: 返回上級文件夾的名字
.stem: 獲取文件名不包含拓展名
.suffix: 獲取文件的拓展名
.anchor: 類似盤符的一個東西,
import pathlib
now_path = pathlib.Path.cwd() / "demo.txt"
print("name",now_path.name)
print("stem",now_path.stem)
print("suffix",now_path.suffix)
print("parent",now_path.parent)
print("anchor",now_path.anchor)
輸出:
name demo.txt
stem demo
suffix .txt
parent /Users/chennan/pythonproject/demo
anchor /
移動和刪除文件
當(dāng)然 pathlib 還可以支持文件其他操作,像移動,更新,甚至刪除文件,但是使用這些方法的時候要小心因為,使用過程不用有任何的錯誤提示即使文件不存在也不會出現(xiàn)等待的情況。
使用 replace 方法可以移動文件,如果文件存在則會覆蓋。為避免文件可能被覆蓋,最簡單的方法是在替換之前測試目標(biāo)是否存在。
import pathlib
destination = pathlib.Path.cwd() / "target"
source = pathlib.Path.cwd() / "demo.txt"
if not destination.exists():
source.replace(destination)
但是上面的方法存在問題就是,在多個進(jìn)程多 destination 進(jìn)行的操作的時候就會現(xiàn)問題,可以使用下面的方法避免這個問題。也就是說上面的方法適合單個文件的操作。
import pathlib
destination = pathlib.Path.cwd() / "target"
source = pathlib.Path.cwd() / "demo.txt"
with destination.open(mode='xb') as fid:
#xb表示文件不存在才操作
fid.write(source.read_bytes())
當(dāng) destination 文件存在的時候上面的代碼就會出現(xiàn) FileExistsError 異常。
從技術(shù)上講,這會復(fù)制一個文件。 要執(zhí)行移動,只需在復(fù)制完成后刪除源即可。
使用 with_name 和 with.shuffix 可以修改文件名字或者后綴。
import pathlib
source = pathlib.Path.cwd() / "demo.py"
source.replace(source.with_suffix(".txt")) #修改后綴并移動文件,即重命名
可以使用.rmdir()和.unlink() 來刪除文件。
幾個 pathlib 的使用例子
統(tǒng)計文件個數(shù)
我們可以使用.iterdir 方法獲取當(dāng)前文件下的所以文件.
import pathlib
from collections import Counter
now_path = pathlib.Path.cwd()
gen = (i.suffix for i in now_path.iterdir())
print(Counter(gen))
輸出:
Counter({'.py': 16, '': 11, '.txt': 1, '.png': 1, '.csv': 1})
通過配合使用 collections 模塊的 Counter 方法,我們獲取了當(dāng)文件夾下文件類型情況。
前面我們說過 glob 模塊點(diǎn)這里了解【glob 模塊的使用】,同樣的 pathlib 也有 glob 方法和 rglob 方法,不同的是 glob 模塊里的 glob 方法結(jié)果是列表形式的,iglob 是生成器類型,在這里 pathlib 的 glob 模塊返回的是生成器類型,然后 pathlib 還有一個支持遞歸操作的 rglob 方法。
下面的這個操作我通過使用 glob 方法,設(shè)定規(guī)則進(jìn)行文件的匹配。
import pathlib
from collections import Counter
gen =(p.suffix for p in pathlib.Path.cwd().glob('*.py'))
print(Counter(gen))
展示目錄樹
下一個示例定義了一個函數(shù) tree(),該函數(shù)的作用是打印一個表示文件層次結(jié)構(gòu)的可視樹,該樹以一個給定目錄為根。因為想列出其子目錄,所以我們要使用.rglob() 方法:
import pathlib
from collections import Counter
def tree(directory):
print(f'+ {directory}')
for path in sorted(directory.rglob('*')):
depth = len(path.relative_to(directory).parts)
spacer = ' ' * depth
print(f'{spacer}+ {path.name}')
now_path = pathlib.Path.cwd()
if __name__ == '__main__':
tree(now_path)
其中 relative_to 的方法的作用是返回 path 相對于 directory 的路徑。
parts 方法可以返回路徑的各部分。例如
import pathlib
now_path = pathlib.Path.cwd()
if __name__ == '__main__':
print(now_path.parts)
返回:
('/', 'Users', 'chennan', 'pythonproject', 'demo')
獲取文件最后一次修改時間
iterdir(),.glob() 和.rglob() 方法非常適合于生成器表達(dá)式和列表理解。
使用 stat()方法可以獲取文件的一些基本信息,使用.stat().st_mtime 可以獲取文件最后一次修改的信息
import pathlib
now_path = pathlib.Path.cwd()
from datetime import datetime
time, file_path = max((f.stat().st_mtime, f) for f in now_path.iterdir())
print(datetime.fromtimestamp(time), file_path)
甚至可以使用類似的表達(dá)式獲取上次修改的文件內(nèi)容
import pathlib
from datetime import datetime
now_path =pathlib.Path.cwd()
result = max((f.stat().st_mtime, f) for f in now_path.iterdir())[1]
print(result.read_text())
.stat().st_mtime 會返回文件的時間戳,可以使用 datetime 或者 time 模塊對時間格式進(jìn)行進(jìn)一步轉(zhuǎn)換
其他內(nèi)容
關(guān)于 pathlib.Path 格式路徑轉(zhuǎn)換為字符串類型
因為通過 pathlib 模塊操作生成的路徑,不能直接應(yīng)用字符串的一些操作,所以需要轉(zhuǎn)換成字符串,雖然可以使用 str()函數(shù)進(jìn)行轉(zhuǎn)換,但是安全性不高,建議使用 os.fspath() 方法,因為如果路徑格式非法的,可以拋出一個異常。str() 就不能做到這一點(diǎn)。
拼接符號 "/" 背后的秘密
/ 運(yùn)算符由 __truediv__()方法定義。 實際上,如果你看一下 pathlib 的源代碼,你會看到類似的東西。
class PurePath(object):
def __truediv__(self, key):
return self._make_child((key,))
后記
從 Python 3.4 開始,pathlib 已在標(biāo)準(zhǔn)庫中提供。 使用 pathlib,文件路徑可以由適當(dāng)?shù)?Path 對象表示,而不是像以前一樣用純字符串表示。 這些對象使代碼處理文件路徑:
更容易閱讀,特別是可以使用“/”將路徑連接在一起
更強(qiáng)大,直接在對象上提供最必要的方法和屬性
在操作系統(tǒng)中更加一致,因為 Path 對象隱藏了不同系統(tǒng)的特性返回搜狐,查看更多
責(zé)任編輯:
總結(jié)
以上是生活随笔為你收集整理的python rpa_(RPA学习)Python 之 Pathlib 模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python123数值运算_python
- 下一篇: java按照io流向基类_Java IO