1. 程式人生 > 實用技巧 >附實戰程式碼|告別OS模組,體驗Python檔案操作新姿勢!

附實戰程式碼|告別OS模組,體驗Python檔案操作新姿勢!

相比常用的os.path而言,pathlib對於目錄路徑的操作更簡介也更貼近Pythonic。但是它不單純是為了簡化操作,還有更大的用途。

pathlib是Python內建庫,Python 文件給它的定義是:The pathlib module – object-oriented filesystem paths(面向物件的檔案系統路徑)

pathlib提供表示檔案系統路徑的類,其語義適用於不同的作業系統。

更多詳細的內容可以參考官方文件:

https://docs.python.org/3/library/pathlib.html#methods


很多人學習python,不知道從何學起。
很多人學習python,掌握了基本語法過後,不知道在哪裡尋找案例上手。


很多已經做案例的人,卻不知道如何去學習更加高深的知識。
那麼針對這三類人,我給大家提供一個好的學習平臺,免費領取視訊教程,電子書籍,以及課程的原始碼!
QQ群:1156465813

一、Path 類的基本使用

下面是獲取檔名、獲取檔名除字尾的部分、獲取檔案字尾、返回一個iterable 包含所有父目錄等常用操作示例

frompathlibimportPath

path=r'D:\python\pycharm2020\program\pathlib模組的基本使用.py'
p=Path(path)
print(p.name)#獲取檔名
print(p.stem)#獲取檔名除字尾的部分
print(p.suffix)#獲取檔案字尾
print(p.parent)#相當於dirname
print(p.parent.parent.parent)
print(p.parents)#返回一個iterable包含所有父目錄
foriinp.parents:
print(i)
print(p.parts)#將路徑通過分隔符分割成一個元組

  

執行結果如下:

pathlib模組的基本使用.py
pathlib模組的基本使用
.py
D:\python\pycharm2020\program
D:\python
<WindowsPath.parents>
D:\python\pycharm2020\program
D:\python\pycharm2020
D:\python
D:\
('D:\\','python','pycharm2020','program','pathlib模組的基本使用.py')
  • Path.cwd()返回表示當前目錄的路徑物件
  • Path.home()返回表示使用者主目錄的路徑物件
  • Path.expanduser()返回帶有擴充套件的 ~user 構造的新路徑
frompathlibimportPath

path_1=Path.cwd()#獲取當前檔案路徑
path_2=Path.home()
p1=Path('~/pathlib模組的基本使用.py')
print(path_1)
print(path_2)
print(p1.expanduser())

執行結果如下:

D:\python\pycharm2020\program
C:\Users\Administrator
C:\Users\Administrator\pathlib模組的基本使用.py

Path.stat()返回一個作業系統統計結果包含有關此路徑的資訊的物件

frompathlibimportPath
importdatetime

p=Path('pathlib模組的基本使用.py')
print(p.stat())#獲取檔案詳細資訊
print(p.stat().st_size)#檔案的位元組大小
print(p.stat().st_ctime)#檔案建立時間
print(p.stat().st_mtime)#上次修改檔案的時間
creat_time=datetime.datetime.fromtimestamp(p.stat().st_ctime)
st_mtime=datetime.datetime.fromtimestamp(p.stat().st_mtime)
print(f'該檔案建立時間:{creat_time}')
print(f'上次修改該檔案的時間:{st_mtime}')

執行結果如下:

os.stat_result(st_mode=33206,st_ino=3659174698076635,st_dev=3730828260,st_nlink=1,st_uid=0,st_gid=0,st_size=543,st_atime=1597366826,st_mtime=1597366826,st_ctime=1597320585)
543
1597320585.7657475
1597366826.9711637
該檔案建立時間:2020-08-1320:09:45.765748
上次修改該檔案的時間:2020-08-1409:00:26.971164

從不同.stat().st_屬性 返回的時間戳表示自1970年1月1日以來的秒數,可以用datetime.fromtimestamp將時間戳轉換為有用的時間格式。

  • Path.exists()路徑是否存在於現有檔案或目錄
  • Path.resolve(strict=False)將路徑設為絕對路徑,解析任何符號連結。返回一個新的路徑物件
frompathlibimportPath

p1=Path('pathlib模組的基本使用.py')#檔案
p2=Path(r'D:\python\pycharm2020\program')#資料夾
absolute_path=p1.resolve()
print(absolute_path)
print(Path('.').exists())
print(p1.exists(),p2.exists())
print(p1.is_file(),p2.is_file())
print(p1.is_dir(),p2.is_dir())
print(Path('/python').exists())
print(Path('non_existent_file').exists())

執行結果如下:

D:\python\pycharm2020\program\pathlib模組的基本使用.py
True
TrueTrue
TrueFalse
FalseTrue
True
False

  • Path.iterdir()當路徑指向某個目錄時,將生成該目錄內容的path物件
frompathlibimportPath

p=Path('/python')
#python目錄下存在的檔案
forchildinp.iterdir():
print(child)

執行結果如下:

\python\Anaconda
\python\EVCapture
\python\Evernote_6.21.3.2048.exe
\python\Notepad++
\python\pycharm-community-2020.1.3.exe
\python\pycharm2020
\python\pyecharts-assets-master
\python\pyecharts-gallery-master
\python\Sublimetext3

  • Path.glob(pattern)Glob此路徑表示的目錄中給定的相對模式,生成所有匹配的檔案(任何型別),**模式表示遞迴地此目錄和所有子目錄。換句話說,它支援遞迴全域性化。
  • Note在大型目錄樹中使用**模式可能會耗費大量時間

遞迴遍歷該目錄下所有檔案,獲取所有符合pattern的檔案,返回一個generator。

下面是一些常用操作的程式碼,拿走就用

獲取該檔案目錄下所有.py檔案

frompathlibimportPath

path=r'D:\python\pycharm2020\program'
p=Path(path)
file_name=p.glob('**/*.py')
print(type(file_name))#<class'generator'>
foriinfile_name:
print(i)

獲取該檔案目錄下所有.jpg圖片

frompathlibimportPath

path=r'D:\python\pycharm2020\program'
p=Path(path)
file_name=p.glob('**/*.jpg')
print(type(file_name))#<class'generator'>
foriinfile_name:
print(i)

獲取給定目錄下所有.txt檔案、.jpg圖片和.py檔案

frompathlibimportPath

defget_files(patterns,path):
all_files=[]
p=Path(path)
foriteminpatterns:
file_name=p.rglob(f'**/*{item}')
all_files.extend(file_name)
returnall_files

path=input('>>>請輸入檔案路徑:')
results=get_files(['.txt','.jpg','.py'],path)
print(results)
forfileinresults:
print(file)

關於Path.mkdir(mode=0o777, parents=False, exist_ok=False)的說明

  • 在給定的路徑上建立一個新目錄。如果指定了mode,它將與程序的umask值結合起來,以確定檔案模式和訪問標誌。如果路徑已存在,則引發FileExistsError。
  • 如果parents引數設定為True,則將根據需要建立此路徑的任何缺少的父級;它們是使用預設許可權建立的,而不考慮模式(模仿POSIX mkdir-p命令)。
  • 如果父項為False(預設值),則缺少父項將引發FileNotFoundError。
  • 如果exist_ok為False(預設值),則在目標目錄已存在的情況下引發FileExistsError。
  • 如果exist_ok為True,則將忽略FileExistsError異常(與POSIX mkdir-p命令的行為相同),但僅當最後一個路徑元件不是現有的非目錄檔案時。

在版本3.5中更改:添加了exist_ok引數。

Path.rmdir():刪除此目錄,目錄必須為空。

frompathlibimportPath

p=Path(r'D:\python\pycharm2020\program\test')
p.mkdir()
p.rmdir()
frompathlibimportPath

p=Path(r'D:\python\test1\test2\test3')
p.mkdir(parents=True)#Ifparentsistrue,anymissingparentsofthispatharecreatedasneeded
p.rmdir()#刪除的是test3資料夾
frompathlibimportPath

p=Path(r'D:\python\test1\test2\test3')
p.mkdir(exist_ok=True)
  • Path.unlink()(missing_ok=False):刪除此檔案或符號連結。如果路徑指向目錄,請使用Path.rmdir()代替。如果missing_ok為False(預設值),則在路徑不存在的情況下引發FileNotFoundError。如果missing_ok為true,則將忽略FileNotFoundError異常。在版本3.8中更改:添加了缺少的“確定”引數。
  • Path.rename()(target):將此檔案或目錄重新命名為給定目標,並返回指向目標的新路徑例項。在Unix上,如果目標存在並且是一個檔案,如果使用者有許可權,它將被無提示地替換。目標可以是字串或其他路徑物件。
  • Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None):開啟路徑指向的檔案,就像內建的 open() 函式一樣。
frompathlibimportPath

p=Path('foo.txt')
p.open(mode='w').write('sometext')
target=Path('new_foo.txt')
p.rename(target)
content=target.open(mode='r').read()
print(content)
target.unlink()

二、與os模組用法的對比

三、實戰案例

對於多層資料夾的讀取,用os模組只能一層一層讀取出檔案,要寫多個for迴圈,效率不高,這時我們可以用Path.glob(**/*)大法,下面以一個實際案例來體驗它的強大。

用於測試的資料夾如下:

md檔案中資料如下:

需要實現將該目錄下所有 md 檔案的資料提取出來,並進行清洗,然後寫入 csv 檔案中

#-*-coding:UTF-8-*-
frompathlibimportPath
importre
importpandasaspd


#傳入路徑
p=Path(r'.\微博熱搜資料\熱搜資料/')
#得到該檔案目錄下所有.md檔案
file_list=list(p.glob('**/*.md'))
print(f'讀取md檔案數量:{len(file_list)}')
foriteminfile_list:
print(item)

#每天有兩條熱搜彙總11點23點會有重合資料去重
filelist=list(filter(lambdax:str(x).find('23點')>=0,file_list))
sum_list=[]

i=0
forfileinfilelist:
#遍歷出每一個md檔案讀取資料
withfile.open(encoding='utf-8')asf:
lines=f.readlines()
lines=[i.strip()foriinlines]#去除空字元
data=list(filter(None,lines))#去除掉列表中的空子串
data=data[1:101]
con=data[::2]#熱搜內容
rank=data[1::2]#熱度
date=re.findall('年(.+)2',str(file))*len(con)
forminrange(len(con)):
con[m]=con[m].split('、')[-1]#字串操作
forninrange(len(rank)):
rank[n]=re.findall(r'\d+',rank[n])[0]
con_dic={'日期':date,'熱搜內容':con,'熱度':rank}
df=pd.DataFrame(con_dic)
ifi==0:
df.to_csv('weibo1.csv',mode='a+',index=False,header=True)
else:
df.to_csv('weibo1.csv',mode='a+',index=False,header=False)
#每個md檔案中有50條資料
i+=50

print('共{}條資料寫入csv'.format(i))

執行效果如下:

可以看到成功將該目錄下所有 md 檔案的資料提取出來,並進行清洗,然後寫入了 csv 檔案中。


注意:如果你是打算找python高薪工作的話。我建議你多寫點真實的企業專案積累經驗。不然工作都找不到,當然很多人沒進過企業,怎麼會存在專案經驗呢? 所以你得多找找企業專案實戰多練習下撒。如果你很懶不想找,也可以進我的Python交流圈:1156465813。群檔案裡面有我之前在做開發寫過的一些真實企業專案案例。你可以拿去學習,不懂都可以在裙裡找我,有空會耐心給你解答下。


以下內容無用,為本篇部落格被搜尋引擎抓取使用
(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)
python 是幹什麼的 零基礎學 python 要多久 python 為什麼叫爬蟲
python 爬蟲菜鳥教程 python 爬蟲萬能程式碼 python 爬蟲怎麼掙錢
python 基礎教程 網路爬蟲 python python 爬蟲經典例子
python 爬蟲
(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)
以上內容無用,為本篇部落格被搜尋引擎抓取使用