Python 目錄和文件操作

From: http://www.cnblogs.com/zhoujie/archive/2013/04/10/python7.html

目錄和文件操作

語(yǔ)言只有和外部連起來(lái)操作才會(huì)實(shí)現(xiàn)更強(qiáng)大的功能,比如操作文件、數(shù)據(jù)庫(kù)等,這樣數(shù)據(jù)可以有一塊單獨(dú)存儲(chǔ)的地方,而不是存放在內(nèi)存中。更強(qiáng)大的是網(wǎng)絡(luò)編程,當(dāng)然這些后續(xù)都會(huì)學(xué)習(xí)。接下來(lái)學(xué)習(xí)python對(duì)目錄和文件的操作。前面的筆記都是基礎(chǔ)理論知識(shí),我覺(jué)得從這里開始幾乎就可以干一些事了。

有關(guān)文件夾與文件的查找,刪除等功能 在os模塊中實(shí)現(xiàn)。使用時(shí)需先導(dǎo)入這個(gè)模塊:import ?os

目錄

1、取得當(dāng)前目錄——os.getcwd()

>>>importos>>> s=os.getcwd()#獲得當(dāng)前運(yùn)行腳本所在目錄>>>s'C:\\Python27'

比如運(yùn)行test.py,那么輸入該命令就會(huì)返回腳本所在的文件夾位置。

例如將test.py放入A文件夾。并且希望不管將A文件夾放在硬盤的哪個(gè)位置,都可以在A文件夾內(nèi)生成一個(gè)新文件夾。且文件夾的名字根據(jù)時(shí)間自動(dòng)生成。

>>>importos>>>importtime>>> folder = time.strftime(r"%Y-%m-%d_%H-%M-%S",time.localtime())>>>os.makedirs(r'%s/%s'%(os.getcwd(),folder))#創(chuàng)建以時(shí)間命名文件夾名

這是運(yùn)行腳本的目錄即'C:\\Python27'下多了一個(gè)以當(dāng)前時(shí)間命名的文件夾

2、創(chuàng)建子目錄——os.makedirs("path"),path是要?jiǎng)?chuàng)建的子目錄

>>> os.makedirs("C:\\temp\\test")#這是C盤下就創(chuàng)建了temp目錄,temp下嵌套的文件夾是test

(當(dāng)然,也可能創(chuàng)建失敗,比如path已存在,或者驅(qū)動(dòng)器不在,或者無(wú)寫權(quán)限等等)

3、更改當(dāng)前目錄——os.chdir()

相當(dāng)于dos或Linux下的cd命令

>>> os.chdir('c:\\')#將當(dāng)前目錄改為C盤根目錄下

4、將路徑分解為目錄名和文件名——os.path.split()

格式為:fpath , fname = os.path.split( "要分解的路徑")

>>> a,b=os.path.split("c:\\dir1\\dir2\\file.txt")>>>printa

c:\dir1\dir2>>>printb

file.txt

5、分解文件名的擴(kuò)展名——os.path.splitext()

格式為:fpath_name , ftext = os.path.splitext( "要分解的路徑")

>>> a,b=os.path.splitext("c:\\dir1\\dir2\\file.txt")>>>printa

c:\dir1\dir2\file>>>printb

.txt

6、判斷一個(gè)路徑(目錄或文件)是否存在——os.path.exists()

格式為:os.path.exists(“要判斷的路徑或文件”)

>>> os.path .exists ("C:\\")#該路徑存在True>>> os.path .exists ("C:\\123\\")#該路徑不存在False>>> os.path .exists ("C:\\123.txt")#該文件不存在False>>> os.path .exists ("C:\\test.txt")#該文件存在True

7、判斷一個(gè)路徑是否有需要的文件——os.path.isfile("文件")

>>> os.path .isfile("C:\\test.txt")

True>>> os.path .isfile("C:\\123.txt")

False

8、判斷一個(gè)路徑是否存在——os.path.isdir("路徑")

>>> os.path .isdir("C:\\")

True>>> os.path .isdir("H:\\")

False

9、獲取目錄中的文件及子目錄的列表——os.listdir("路徑")

相當(dāng)于Windows下powershell中獲取Get-ChildItem命令和Linux中的ls命令。但是這個(gè)顯示不是以常見(jiàn)的列表的形式:

>>> os.listdir("C:\\")? #這里包括隱藏文件也顯示出來(lái)了

['$Recycle.Bin','360ld','360rescue','360SANDBOX','360SysRt','Boot','bootmgr','BOOTSECT.BAK','CacheTemp','Documents and Settings','grldr','IFRToolLog.txt','inetpub','MSOCache','pagefile.sys','Program Files','Program Files (x86)','ProgramData','Python27','Recovery','RECYCLER','SBTDR','System Volume Information','test.txt','Users','Windows']

示例:獲取指定目錄下的所有子目錄的列表

+ View Code

獲取指定目錄下所有文件的列表

+ View Code

10、刪除子目錄——os.rmdir("path"),只能刪除空目錄

>>> os.rmdir("C:\\temp\\test")#注意只刪除了test目錄>>> os.rmdir("C:\\temp")#這里才刪除了temp目錄

文件

python中模塊的引入使得對(duì)文件的操作變的很簡(jiǎn)單。最基本的文件操作就是在文件中進(jìn)行讀寫數(shù)據(jù),在操作文件之前要打開文件。

打開文件——open('file'[,'mode'])

>>>import os

>>>os.getcwd()'c:\\'>>> file=open('test.txt')#默認(rèn)的mode是'r',即讀模式>>>file.read()? #讀取文件內(nèi)容'hello\nworld\nhello,python'? #? \n在文件中的形式是換行

mode的選項(xiàng)即含義如下:

模 式

描述

r

以讀方式打開文件,可讀取文件信息。

w

以寫方式打開文件,可向文件寫入信息。如文件存在,則清空該文件,再寫入新內(nèi)容;如果文件不存在則創(chuàng)建

a

以追加模式打開文件(即一打開文件,文件指針自動(dòng)移到文件末尾),如果文件不存在則創(chuàng)建

r+

以讀寫方式打開文件,可對(duì)文件進(jìn)行讀和寫操作。

w+

消除文件內(nèi)容,然后以讀寫方式打開文件。

a+

以讀寫方式打開文件,并把文件指針移到文件尾。

b

以二進(jìn)制模式打開文件,而不是以文本模式。該模式只對(duì)Windows或Dos有效,類Unix的文件是用二進(jìn)制模式進(jìn)行操作的。

關(guān)于文件的其他操作我覺(jué)得沒(méi)必要記錄的很詳細(xì)了,因?yàn)榛径己芎?jiǎn)單,下面列出的是文件的常用方法,并且在例子中有相關(guān)說(shuō)明。另外有一點(diǎn)注意的是讀取文件中經(jīng)常存在的編碼問(wèn)題。不同的解釋器默認(rèn)的編碼不同,具體解決方案會(huì)再介紹。

常見(jiàn)文件操作方法:

方法

描述

f.close()

關(guān)閉文件,記住用open()打開文件后一定要記得關(guān)閉它,否則會(huì)占用系統(tǒng)的可打開文件句柄數(shù)。

f.name()

獲取文件名稱

f.next()

返回下一行,并將文件操作標(biāo)記位移到下一行。把一個(gè)file用于for … in file這樣的語(yǔ)句時(shí),就是調(diào)用next()函數(shù)來(lái)實(shí)現(xiàn)遍歷的。

f.fileno()

獲得文件描述符,是一個(gè)數(shù)字。返回一個(gè)長(zhǎng)整型的”文件標(biāo)簽“

f.flush()

刷新輸出緩存,把緩沖區(qū)的內(nèi)容寫入硬盤

f.isatty()

如果文件是一個(gè)終端設(shè)備文件(Linux系統(tǒng)中),則返回True,否則返回False。

f.read([size])

讀出文件,size為讀取的長(zhǎng)度,以byte為單位

f.readline([size])

讀出一行信息,若定義了size,則讀出 一行的一部分

f.readlines([size])

讀出所有行,也就是讀出整個(gè)文件的信息。(把文件每一行作為一個(gè)list的一個(gè)成員,并返回這個(gè)list。其實(shí)它的內(nèi)部是通過(guò)循環(huán)調(diào)用readline()來(lái)實(shí)現(xiàn)的。如果提供size參數(shù),size是表示讀取內(nèi)容的總長(zhǎng),也就是說(shuō)可能只讀到文件的一部分)

f.seek(offset[,where])

把文件指針移動(dòng)到相對(duì)于where的offset位置。where為0表示文件開始處,這是默認(rèn)值?;1表示當(dāng)前位置;2表示文件結(jié)尾。(注意:如果文件以a或a+的模式打開,每次進(jìn)行寫操作時(shí),文件操作標(biāo)記會(huì)自動(dòng)返回到文件末尾)

f.tell()

獲得文件指針位置,標(biāo)記當(dāng)前位置,以文件開頭為原點(diǎn)

f.truncate([size])

把文件裁成規(guī)定的大小,默認(rèn)的是裁到當(dāng)前文件操作標(biāo)記的位置。如果size比文件的大小還要大,依據(jù)系統(tǒng)的不同可能是不改變文件,也可能是用0把文件補(bǔ)到相應(yīng)的大小,也可能是以一些隨機(jī)的內(nèi)容加上去。

f.write(string)

把string字符串寫入文件,write()不會(huì)在str后加上一個(gè)換行符。

f.writelines(list)

把list中的字符串一行一行地寫入文件,是連續(xù)寫入文件,沒(méi)有換行。

現(xiàn)有一個(gè)test.txt文件,格式如下:

hello

world

hello

python

下面是一些常見(jiàn)操作:

>>> file=open('test.txt')>>> file.read (4)#讀取前4個(gè)字節(jié)'hell'>>> file.read(6)#注意這里是在剛才讀過(guò)的基礎(chǔ)上再向后讀的'o\nworl'>>> file.read ()#不指定size,則讀到文件結(jié)尾'd\nhello\npython'>>> file.read()#再讀時(shí)已是文件結(jié)尾''>>> file.seek(0)#將文件位置定位到第一個(gè)字節(jié)>>> file.readline ()#一次讀一行'hello\n'>>>file.readline ()'world\n'>>> file.seek(0)#將文件定位到開始>>> file.readlines ()#讀取整個(gè)文件的內(nèi)容['hello\n','world\n','hello\n','python']

>>> file .tell()#讀完之后顯示seek位置,即文件的最后了

27L#以長(zhǎng)整型表示

>>> file.name#查看文件的名稱

'test.txt'

>>> file.close()#關(guān)閉文件

剛開始測(cè)試read和readline等用法的時(shí)候,因?yàn)橹灰x取一次就在上次基礎(chǔ)上往后讀,當(dāng)時(shí)我還以為這是一個(gè)出棧操作,顯然,知道有seek這個(gè)方法后,我才知道它不是,只是每次讀的時(shí)候seek的位置就往后移動(dòng)一個(gè),而每次讀取是以seek所在的位置為起點(diǎn)的。所以如果需要從頭開始讀取文件內(nèi)容時(shí),將文件位置設(shè)為開始即可,即seek(0)。

>>> file=open('test.txt','w')>>> file.write ('\nwelcome')#會(huì)將之前的內(nèi)容覆蓋>>> file.writelines ('I love python')>>> file.close ()#關(guān)閉文件時(shí)才能看到文件內(nèi)容的修改

>>> file=open('test.txt','a')#追加到文件尾,而不會(huì)覆蓋>>> file.writelines ('this is a test')>>> file.close()

對(duì)文件的相關(guān)操作有時(shí)需要引入shutil模塊:

>>>importshutil>>> shutil.copyfile('test.txt','123.txt')#參數(shù)只能是文件>>> shutil.copy("olddir","newfileordir")#olddir只能是文件夾,newfile可以是文件,也可以是目標(biāo)目錄>>> shutil.copytree("olddir","newdir")#olddir和newdir都只能是目錄,且newdir必須不存在>>> shutil.move("oldpos","newpos")#移動(dòng)文件或目錄>>> shutil.rmtree("dir")#空目錄、有內(nèi)容的目錄都可以刪>>>importos

>>>os.rmdir("dir")#只能刪除空目錄>>> os.remove("file")#刪除文件>>> os.rename("oldname","newname")#文件或目錄都是使用這條命令

關(guān)于文件和目錄操作的總結(jié),推薦博客:http://www.cnblogs.com/rollenholt/archive/2012/04/23/2466179.html

文件編碼:

#獲得當(dāng)前環(huán)境默認(rèn)編碼>>>importsys>>>importlocale>>>sys.getdefaultencoding()# 返回當(dāng)前系統(tǒng)所使用的默認(rèn)字符編碼'ascii'>>>sys.getfilesystemencoding ()# 返回用于轉(zhuǎn)換Unicode文件名至系統(tǒng)文件名所使用的編碼'mbcs'>>>locale.getdefaultlocale()# 獲取默認(rèn)的區(qū)域設(shè)置并返回元組(語(yǔ)言, 編碼)('zh_CN','cp936')>>>locale .getpreferredencoding ()# 返回用戶設(shè)定的文本數(shù)據(jù)編碼'cp936'

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容