4招小技巧识虚,帶你迅速提升Python文件處理的逼格
原創(chuàng)?xinxin?菜鳥學(xué)Python?
這是菜鳥學(xué)python的第31篇原創(chuàng)文章
閱讀本文大概需要6分鐘
文件這塊知識已經(jīng)講了好幾篇,
第一篇是2個小例子入門
第二篇是文件語法和場景的一個總覽
第三篇是一個綜合小例子實戰(zhàn)一下,可以融合前面所學(xué)的知識
這一篇算是收尾吧哭靖,回憶我以前寫過的python程序芳誓,我覺得python文件處理有這么幾個模塊非常重要湖雹,但是一般沒有人告訴你,學(xué)會這幾招后,讓你的工作會更方便更實用一些.
其實我最開始學(xué)的時候壓根沒有人告訴我這幾招,后來工作中寫代碼多了示惊,看了一些別人的開源代碼好港,才發(fā)現(xiàn)哇有這么好的模塊,真是相見恨晚啊!!
所以分享給大家,可以讓初學(xué)者少走彎路.也許哪一天你工作中用到這塊米罚,可以翻開我的文章看一下~~
1.如何對多個文件中的內(nèi)容替換
假設(shè)在當(dāng)前目錄下有2個文件 test01.txt,test02.txt
我們需要把里面的Java全部替換為Python,一次搞定怎么做呢?
|--test01.txt---
Hi All,
What Is Java?
What Is Programming?
|--test02.txt---
Hi All,
Why do people use Java?
It’s an important tool to learn
Python標(biāo)準(zhǔn)庫里面有一個很強(qiáng)大的模塊fileinput?,fileinput 模塊允許你循環(huán)一個或多個文本文件的內(nèi)容,非常實用
#!/usr/bin/env python
import fileinput?
import glob
#利用glob模塊過濾出當(dāng)前目錄下所有的txt文件
#inplace=1 標(biāo)準(zhǔn)輸出,比如print會被重定向到打開文件
#把每一行去掉回車钧汹,然后把java替換為Python
for line in fileinput.input(glob.glob('*.txt'),inplace=1):
? ? print line.strip().replace('Java','Python')
fileinput.close()#關(guān)閉文件句柄
>>
|--test01.txt---
Hi All,
What Is Python?
What Is Programming?
|--test02.txt---
Hi All,
Why do people use Python?
it’s an important tool to learn
是不是很方便,假如你在批處理郵件录择,有1000封郵件拔莱,你希望把里面的標(biāo)題改掉,這招是不是很爽.
2.如何列出全目錄結(jié)構(gòu)
有的時候我們想列出當(dāng)前目錄下所有文件和子目錄隘竭,有沒有直接的方法
不需要用遞歸去處理塘秦,有python內(nèi)置的os.walk()函數(shù),一招搞定动看,是不是很貼心
假如我們有這樣的一個目錄結(jié)構(gòu)為'C:\myPython',結(jié)構(gòu)如下:
|---demo---
|--demo_01.exe
|--demo_02.msi
|--other
|--info.docc
|---log-----
|--1110_log.txt
|--1111_log.txt
|--1112_log.txt
|---pic-----
|--0127_1.jpg
|--0127_2.jpg
|--0127_3.jpg
#!/usr/bin/env python
import os
path=r'C:\myPython'
for folderName,subfolders,filenames in os.walk(path):
? ? print 'The current folder is :'+folderName
for subfolder in subfolders:#列出子目錄
? ? ? ? print ('Subfolder of '+folderName+': '+subfolder)
for file_name in filenames:#列出文件
? ? ? ? print ('File insdie '+folderName+': '+file_name)
>>
The current folder is :C:\myPython
Subfolder of C:\myPython: demo
Subfolder of C:\myPython: log
Subfolder of C:\myPython: pic
The current folder is :C:\myPython\demo
Subfolder of C:\myPython\demo: other
File insdie C:\myPython\demo: demo_01.exe
File insdie C:\myPython\demo: demo_02.msi
The current folder is :C:\myPython\demo\other
File insdie C:\myPython\demo\other: info.docx
The current folder is :C:\myPython\log
File insdie C:\myPython\log: 1110_log.txt
File insdie C:\myPython\log: 1111_log.txt
File insdie C:\myPython\log: 1112_log.txt
The current folder is :C:\myPython\pic
File insdie C:\myPython\pic: 0127_1.jpg
File insdie C:\myPython\pic: 0127_2.jpg
File insdie C:\myPython\pic: 0127_3.jpg
3.如何把多個文件copy到另外一個目錄下
有的時候我們需要把一個或者多個文件備份到另外一個目錄下尊剔,有沒有啥辦法,簡單快捷搞定.有的,python提供了一個高級文件模塊叫shutil,可以輕松搞定.
假如我們當(dāng)前目錄下有這樣一個文件結(jié)構(gòu):
|---backup---
|--abc.txt
|---test01.txt---
|---test02.txt---
問題:
我們想把test01.txt和text02.txt備份到backup下,怎么辦
解決:
5行代碼搞定
#!/usr/bin/env python
#列出所有的文件
#過濾出txt文件
#copy到backup下
import shutil,os
for file in os.listdir('.'):
? ? if os.path.splitext(file)[1]=='.txt':
? ? ? ? shutil.copy(file,os.path.join('backup',file))
也許有同學(xué)說怎么拷貝目錄菱皆,也有現(xiàn)成的模塊
shutil.copytree('backup', 'backup2')
創(chuàng)建了backup2目錄须误,然后把backup下的文件全部都copy過來
4.刪除目錄以及所有子目錄的文件
很多時候特別是我們要清空一個目錄的時候,若這個目錄下面有文件仇轻,或者不為空京痢,直接用os.rmdir('backup2'),會報錯,告訴你:The directory is not empty: 'backup2'
捉急啊篷店,怎么辦呢:
用shutil.rmtree('backup2')祭椰,backup2目錄就全部刪掉了
細(xì)心的同學(xué)會發(fā)現(xiàn)我的源碼上面為啥要加上"#!/usr/bin/env python",因為我的源碼都是在win編譯執(zhí)行的,有同學(xué)反映這樣在linux,mac上運行會報錯船庇,確實會有這個問題:
很多小白剛開始學(xué)的時候吭产,都會原封不動的把源碼拿過來執(zhí)行(我當(dāng)時學(xué)的時候也是這樣的),也許老鳥或者有經(jīng)驗的同學(xué)一看鸭轮,哦這個問題啊,原來是沒有引入python解釋器的路徑
但是對新手來說臣淤,可能會花很多時間去debug,去查找問題.
所以我決定寧可我麻煩一點,每一段都加上這個頭窃爷,也要保證新手能準(zhǔn)確無誤的運行我的代碼邑蒋,有的時候確實要換位思考一下小白用戶的感受.也許你多花幾秒鐘多寫幾行,卻可以幫助新手按厘,幫助別人節(jié)省好多時間医吊,少走很多彎路.