From: http://www.cnblogs.com/zhoujie/archive/2013/04/10/python7.html
目錄和文件操作
語言只有和外部連起來操作才會實現(xiàn)更強大的功能,比如操作文件哑姚、數(shù)據(jù)庫等棵譬,這樣數(shù)據(jù)可以有一塊單獨存儲的地方,而不是存放在內(nèi)存中。更強大的是網(wǎng)絡編程,當然這些后續(xù)都會學習。接下來學習python對目錄和文件的操作。前面的筆記都是基礎理論知識狞悲,我覺得從這里開始幾乎就可以干一些事了。
有關文件夾與文件的查找妇斤,刪除等功能 在os模塊中實現(xiàn)摇锋。使用時需先導入這個模塊:import ?os
目錄
1、取得當前目錄——os.getcwd()
>>>importos>>> s=os.getcwd()#獲得當前運行腳本所在目錄>>>s'C:\\Python27'
比如運行test.py站超,那么輸入該命令就會返回腳本所在的文件夾位置荸恕。
例如將test.py放入A文件夾。并且希望不管將A文件夾放在硬盤的哪個位置死相,都可以在A文件夾內(nèi)生成一個新文件夾戚炫。且文件夾的名字根據(jù)時間自動生成。
>>>importos>>>importtime>>> folder = time.strftime(r"%Y-%m-%d_%H-%M-%S",time.localtime())>>>os.makedirs(r'%s/%s'%(os.getcwd(),folder))#創(chuàng)建以時間命名文件夾名
這是運行腳本的目錄即'C:\\Python27'下多了一個以當前時間命名的文件夾
2媳纬、創(chuàng)建子目錄——os.makedirs("path")双肤,path是要創(chuàng)建的子目錄
>>> os.makedirs("C:\\temp\\test")#這是C盤下就創(chuàng)建了temp目錄,temp下嵌套的文件夾是test
(當然钮惠,也可能創(chuàng)建失敗茅糜,比如path已存在,或者驅動器不在素挽,或者無寫權限等等)
3蔑赘、更改當前目錄——os.chdir()
相當于dos或Linux下的cd命令
>>> os.chdir('c:\\')#將當前目錄改為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预明、分解文件名的擴展名——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缩赛、判斷一個路徑(目錄或文件)是否存在——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、判斷一個路徑是否有需要的文件——os.path.isfile("文件")
>>> os.path .isfile("C:\\test.txt")
True>>> os.path .isfile("C:\\123.txt")
False
8撰糠、判斷一個路徑是否存在——os.path.isdir("路徑")
>>> os.path .isdir("C:\\")
True>>> os.path .isdir("H:\\")
False
9酥馍、獲取目錄中的文件及子目錄的列表——os.listdir("路徑")
相當于Windows下powershell中獲取Get-ChildItem命令和Linux中的ls命令。但是這個顯示不是以常見的列表的形式:
>>> os.listdir("C:\\")? #這里包括隱藏文件也顯示出來了
['$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']
示例:獲取指定目錄下的所有子目錄的列表
獲取指定目錄下所有文件的列表
10阅酪、刪除子目錄——os.rmdir("path"),只能刪除空目錄
>>> os.rmdir("C:\\temp\\test")#注意只刪除了test目錄>>> os.rmdir("C:\\temp")#這里才刪除了temp目錄
文件
python中模塊的引入使得對文件的操作變的很簡單旨袒。最基本的文件操作就是在文件中進行讀寫數(shù)據(jù),在操作文件之前要打開文件术辐。
打開文件——open('file'[,'mode'])
>>>import os
>>>os.getcwd()'c:\\'>>> file=open('test.txt')#默認的mode是'r'砚尽,即讀模式>>>file.read()? #讀取文件內(nèi)容'hello\nworld\nhello,python'? #? \n在文件中的形式是換行
mode的選項即含義如下:
模 式
描述
r
以讀方式打開文件,可讀取文件信息辉词。
w
以寫方式打開文件必孤,可向文件寫入信息。如文件存在瑞躺,則清空該文件敷搪,再寫入新內(nèi)容兴想;如果文件不存在則創(chuàng)建
a
以追加模式打開文件(即一打開文件,文件指針自動移到文件末尾)购啄,如果文件不存在則創(chuàng)建
r+
以讀寫方式打開文件襟企,可對文件進行讀和寫操作嘱么。
w+
消除文件內(nèi)容狮含,然后以讀寫方式打開文件。
a+
以讀寫方式打開文件曼振,并把文件指針移到文件尾几迄。
b
以二進制模式打開文件,而不是以文本模式冰评。該模式只對Windows或Dos有效映胁,類Unix的文件是用二進制模式進行操作的。
關于文件的其他操作我覺得沒必要記錄的很詳細了甲雅,因為基本都很簡單解孙,下面列出的是文件的常用方法,并且在例子中有相關說明抛人。另外有一點注意的是讀取文件中經(jīng)常存在的編碼問題弛姜。不同的解釋器默認的編碼不同,具體解決方案會再介紹妖枚。
常見文件操作方法:
方法
描述
f.close()
關閉文件廷臼,記住用open()打開文件后一定要記得關閉它,否則會占用系統(tǒng)的可打開文件句柄數(shù)绝页。
f.name()
獲取文件名稱
f.next()
返回下一行荠商,并將文件操作標記位移到下一行。把一個file用于for … in file這樣的語句時续誉,就是調(diào)用next()函數(shù)來實現(xiàn)遍歷的莱没。
f.fileno()
獲得文件描述符,是一個數(shù)字酷鸦。返回一個長整型的”文件標簽“
f.flush()
刷新輸出緩存郊愧,把緩沖區(qū)的內(nèi)容寫入硬盤
f.isatty()
如果文件是一個終端設備文件(Linux系統(tǒng)中),則返回True井佑,否則返回False属铁。
f.read([size])
讀出文件,size為讀取的長度躬翁,以byte為單位
f.readline([size])
讀出一行信息焦蘑,若定義了size,則讀出 一行的一部分
f.readlines([size])
讀出所有行盒发,也就是讀出整個文件的信息例嘱。(把文件每一行作為一個list的一個成員狡逢,并返回這個list。其實它的內(nèi)部是通過循環(huán)調(diào)用readline()來實現(xiàn)的拼卵。如果提供size參數(shù)奢浑,size是表示讀取內(nèi)容的總長,也就是說可能只讀到文件的一部分)
f.seek(offset[,where])
把文件指針移動到相對于where的offset位置腋腮。where為0表示文件開始處雀彼,這是默認值?;1表示當前位置即寡;2表示文件結尾徊哑。(注意:如果文件以a或a+的模式打開,每次進行寫操作時聪富,文件操作標記會自動返回到文件末尾)
f.tell()
獲得文件指針位置莺丑,標記當前位置,以文件開頭為原點
f.truncate([size])
把文件裁成規(guī)定的大小墩蔓,默認的是裁到當前文件操作標記的位置梢莽。如果size比文件的大小還要大,依據(jù)系統(tǒng)的不同可能是不改變文件奸披,也可能是用0把文件補到相應的大小昏名,也可能是以一些隨機的內(nèi)容加上去。
f.write(string)
把string字符串寫入文件源内,write()不會在str后加上一個換行符葡粒。
f.writelines(list)
把list中的字符串一行一行地寫入文件,是連續(xù)寫入文件膜钓,沒有換行嗽交。
現(xiàn)有一個test.txt文件,格式如下:
hello
world
hello
python
下面是一些常見操作:
>>> file=open('test.txt')>>> file.read (4)#讀取前4個字節(jié)'hell'>>> file.read(6)#注意這里是在剛才讀過的基礎上再向后讀的'o\nworl'>>> file.read ()#不指定size颂斜,則讀到文件結尾'd\nhello\npython'>>> file.read()#再讀時已是文件結尾''>>> file.seek(0)#將文件位置定位到第一個字節(jié)>>> file.readline ()#一次讀一行'hello\n'>>>file.readline ()'world\n'>>> file.seek(0)#將文件定位到開始>>> file.readlines ()#讀取整個文件的內(nèi)容['hello\n','world\n','hello\n','python']
>>> file .tell()#讀完之后顯示seek位置夫壁,即文件的最后了
27L#以長整型表示
>>> file.name#查看文件的名稱
'test.txt'
>>> file.close()#關閉文件
剛開始測試read和readline等用法的時候,因為只要讀取一次就在上次基礎上往后讀沃疮,當時我還以為這是一個出棧操作盒让,顯然,知道有seek這個方法后司蔬,我才知道它不是邑茄,只是每次讀的時候seek的位置就往后移動一個,而每次讀取是以seek所在的位置為起點的俊啼。所以如果需要從頭開始讀取文件內(nèi)容時肺缕,將文件位置設為開始即可,即seek(0)。
>>> file=open('test.txt','w')>>> file.write ('\nwelcome')#會將之前的內(nèi)容覆蓋>>> file.writelines ('I love python')>>> file.close ()#關閉文件時才能看到文件內(nèi)容的修改
>>> file=open('test.txt','a')#追加到文件尾同木,而不會覆蓋>>> file.writelines ('this is a test')>>> file.close()
對文件的相關操作有時需要引入shutil模塊:
>>>importshutil>>> shutil.copyfile('test.txt','123.txt')#參數(shù)只能是文件>>> shutil.copy("olddir","newfileordir")#olddir只能是文件夾浮梢,newfile可以是文件,也可以是目標目錄>>> shutil.copytree("olddir","newdir")#olddir和newdir都只能是目錄彤路,且newdir必須不存在>>> shutil.move("oldpos","newpos")#移動文件或目錄>>> shutil.rmtree("dir")#空目錄秕硝、有內(nèi)容的目錄都可以刪>>>importos
>>>os.rmdir("dir")#只能刪除空目錄>>> os.remove("file")#刪除文件>>> os.rename("oldname","newname")#文件或目錄都是使用這條命令
關于文件和目錄操作的總結,推薦博客:http://www.cnblogs.com/rollenholt/archive/2012/04/23/2466179.html
文件編碼:
#獲得當前環(huán)境默認編碼>>>importsys>>>importlocale>>>sys.getdefaultencoding()# 返回當前系統(tǒng)所使用的默認字符編碼'ascii'>>>sys.getfilesystemencoding ()# 返回用于轉換Unicode文件名至系統(tǒng)文件名所使用的編碼'mbcs'>>>locale.getdefaultlocale()# 獲取默認的區(qū)域設置并返回元組(語言, 編碼)('zh_CN','cp936')>>>locale .getpreferredencoding ()# 返回用戶設定的文本數(shù)據(jù)編碼'cp936'