电竞比分网-中国电竞赛事及体育赛事平台

分享

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

 Four兄 2019-08-24

這是菜鳥學(xué)python的第31篇原創(chuàng)文章

閱讀本文大概需要6分鐘

文件這塊知識(shí)已經(jīng)講了好幾篇,

  • 第一篇是2個(gè)小例子入門

  • 第二篇是文件語法和場(chǎng)景的一個(gè)總覽

  • 第三篇是一個(gè)綜合小例子實(shí)戰(zhàn)一下,可以融合前面所學(xué)的知識(shí)

  • 這一篇算是收尾吧,回憶我以前寫過的python程序,我覺得python文件處理有這么幾個(gè)模塊非常重要,但是一般沒有人告訴你,學(xué)會(huì)這幾招后,讓你的工作會(huì)更方便更實(shí)用一些.

其實(shí)我最開始學(xué)的時(shí)候壓根沒有人告訴我這幾招,后來工作中寫代碼多了,看了一些別人的開源代碼,才發(fā)現(xiàn)哇有這么好的模塊,真是相見恨晚啊!!

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

1.如何對(duì)多個(gè)文件中的內(nèi)容替換

假設(shè)在當(dāng)前目錄下有2個(gè)文件 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)庫(kù)里面有一個(gè)很強(qiáng)大的模塊fileinput ,fileinput 模塊允許你循環(huán)一個(gè)或多個(gè)文本文件的內(nèi)容,非常實(shí)用

#!/usr/bin/env python

import fileinput 

import glob

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

#inplace=1 標(biāo)準(zhǔn)輸出,比如print會(huì)被重定向到打開文件

#把每一行去掉回車,然后把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)

有的時(shí)候我們想列出當(dāng)前目錄下所有文件和子目錄,有沒有直接的方法

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

假如我們有這樣的一個(gè)目錄結(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.如何把多個(gè)文件copy到另外一個(gè)目錄下

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

假如我們當(dāng)前目錄下有這樣一個(gè)文件結(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.刪除目錄以及所有子目錄的文件

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

捉急啊,怎么辦呢:

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

細(xì)心的同學(xué)會(huì)發(fā)現(xiàn)我的源碼上面為啥要加上'#!/usr/bin/env python',因?yàn)槲业脑创a都是在win編譯執(zhí)行的,有同學(xué)反映這樣在linux,mac上運(yùn)行會(huì)報(bào)錯(cuò),確實(shí)會(huì)有這個(gè)問題:

  • 很多小白剛開始學(xué)的時(shí)候,都會(huì)原封不動(dòng)的把源碼拿過來執(zhí)行(我當(dāng)時(shí)學(xué)的時(shí)候也是這樣的),也許老鳥或者有經(jīng)驗(yàn)的同學(xué)一看,哦這個(gè)問題啊,原來是沒有引入python解釋器的路徑

  • 但是對(duì)新手來說,可能會(huì)花很多時(shí)間去debug,去查找問題.

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


好了文件擴(kuò)展模塊小技巧就講到這里啦,希望能給初學(xué)者一些啟發(fā),若有什么不懂的,也可以留言跟我探討交流.

最后說一下,原創(chuàng)真的不易,希望大家能夠給點(diǎn)支持,歡迎轉(zhuǎn)發(fā)轉(zhuǎn)發(fā)轉(zhuǎn)發(fā),留言留言留言,重要的事情說三遍,也是對(duì)我的一點(diǎn)鼓勵(lì)和動(dòng)力.

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多