4招小技巧,帶你迅速提升Python文件處理的逼格

這是菜鳥學python的第31篇原創文章

閱讀本文大概需要6分鐘

文件這塊知識已經講了好幾篇,

第一篇是2個小例子入門

mp.weixin.qq.com/s?

第二篇是文件語法和場景的一個總覽

mp.weixin.qq.com/s?

第三篇是一個綜合小例子實戰一下,可以融合前面所學的知識

mp.weixin.qq.com/s?

這一篇算是收尾吧,回憶我以前寫過的python程序,我覺得python文件處理有這麼幾個模塊非常重要,但是一般沒有人告訴你,學會這幾招後,讓你的工作會更方便更實用一些.

mp.weixin.qq.com/s?

其實我最開始學的時候壓根沒有人告訴我這幾招,後來工作中寫代碼多了,看了一些別人的開源代碼,才發現哇有這麼好的模塊,真是相見恨晚啊!!

所以分享給大家,可以讓初學者少走彎路.也許哪一天你工作中用到這塊,可以翻開我的文章看一下~~

1.如何對多個文件中的內容替換

假設在當前目錄下有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標準庫裡面有一個很強大的模塊fileinput ,fileinput 模塊允許你循環一個或多個文本文件的內容,非常實用

#!/usr/bin/env python

import fileinput

import glob

#利用glob模塊過濾出當前目錄下所有的txt文件

#inplace=1 標準輸出,比如print會被重定向到打開文件

#把每一行去掉回車,然後把java替換為Python

for line in fileinput.input(glob.glob(*.txt),inplace=1):

print line.strip().replace(Java,Python)

fileinput.close()#關閉文件句柄

>>

|--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封郵件,你希望把裡面的標題改掉,這招是不是很爽.

2.如何列出全目錄結構

有的時候我們想列出當前目錄下所有文件和子目錄,有沒有直接的方法

不需要用遞歸去處理,有python內置的os.walk()函數,一招搞定,是不是很貼心

假如我們有這樣的一個目錄結構為C:myPython,結構如下:

|---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=rC: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:myPythondemo

Subfolder of C:myPythondemo: other

File insdie C:myPythondemo: demo_01.exe

File insdie C:myPythondemo: demo_02.msi

The current folder is :C:myPythondemoother

File insdie C:myPythondemoother: info.docx

The current folder is :C:myPythonlog

File insdie C:myPythonlog: 1110_log.txt

File insdie C:myPythonlog: 1111_log.txt

File insdie C:myPythonlog: 1112_log.txt

The current folder is :C:myPythonpic

File insdie C:myPythonpic: 0127_1.jpg

File insdie C:myPythonpic: 0127_2.jpg

File insdie C:myPythonpic: 0127_3.jpg

3.如何把多個文件copy到另外一個目錄下

有的時候我們需要把一個或者多個文件備份到另外一個目錄下,有沒有啥辦法,簡單快捷搞定.有的,python提供了一個高級文件模塊叫shutil,可以輕鬆搞定.

假如我們當前目錄下有這樣一個文件結構:

|---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))

也許有同學說怎麼拷貝目錄,也有現成的模塊

shutil.copytree(backup, backup2)

創建了backup2目錄,然後把backup下的文件全部都copy過來

4.刪除目錄以及所有子目錄的文件

很多時候特別是我們要清空一個目錄的時候,若這個目錄下面有文件,或者不為空,直接用os.rmdir(backup2),會報錯,告訴你:The directory is not empty: backup2

捉急啊,怎麼辦呢:

用shutil.rmtree(backup2),backup2目錄就全部刪掉了

細心的同學會發現我的源碼上面為啥要加上"#!/usr/bin/env python",因為我的源碼都是在win編譯執行的,有同學反映這樣在linux,mac上運行會報錯,確實會有這個問題:

很多小白剛開始學的時候,都會原封不動的把源碼拿過來執行(我當時學的時候也是這樣的),也許老鳥或者有經驗的同學一看,哦這個問題啊,原來是沒有引入python解釋器的路徑

但是對新手來說,可能會花很多時間去debug,去查找問題.

所以我決定寧可我麻煩一點,每一段都加上這個頭,也要保證新手能準確無誤的運行我的代碼,有的時候確實要換位思考一下小白用戶的感受.也許你多花幾秒鐘多寫幾行,卻可以幫助新手,幫助別人節省好多時間,少走很多彎路.

好了文件綜合實戰小例子就講到這裡啦,希望能給初學者一些啟發,若有什麼不懂的,也可以留言跟我探討交流.

最後說一下,原創真的不易,希望大家能夠給點支持,歡迎轉發,留言,也是對我的一點鼓勵和動力.

也歡迎更多喜歡Python的同學關注 菜鳥學python,一起來學python吧


推薦閱讀:

TAG:Python入門 | Python開發 | Python |