Python 目錄和文件操作

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']

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

+ View Code

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

+ View Code

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'

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末洲尊,一起剝皮案震驚了整個濱河市远豺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌颊郎,老刑警劉巖憋飞,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霎苗,死亡現(xiàn)場離奇詭異姆吭,居然都是意外死亡,警方通過查閱死者的電腦和手機唁盏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門内狸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人厘擂,你說我怎么就攤上這事昆淡。” “怎么了刽严?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵昂灵,是天一觀的道長。 經(jīng)常有香客問我舞萄,道長眨补,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任倒脓,我火速辦了婚禮撑螺,結果婚禮上,老公的妹妹穿的比我還像新娘崎弃。我一直安慰自己甘晤,他們只是感情好,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布饲做。 她就那樣靜靜地躺著线婚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盆均。 梳的紋絲不亂的頭發(fā)上塞弊,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音,去河邊找鬼居砖。 笑死虹脯,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的奏候。 我是一名探鬼主播循集,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蔗草!你這毒婦竟也來了咒彤?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤咒精,失蹤者是張志新(化名)和其女友劉穎镶柱,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體模叙,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡歇拆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了范咨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片故觅。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖渠啊,靈堂內(nèi)的尸體忽然破棺而出输吏,到底是詐尸還是另有隱情,我是刑警寧澤替蛉,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布贯溅,位于F島的核電站,受9級特大地震影響躲查,放射性物質發(fā)生泄漏它浅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一熙含、第九天 我趴在偏房一處隱蔽的房頂上張望罚缕。 院中可真熱鬧,春花似錦怎静、人聲如沸邮弹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腌乡。三九已至,卻和暖如春夜牡,著一層夾襖步出監(jiān)牢的瞬間与纽,已是汗流浹背侣签。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留急迂,地道東北人影所。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像僚碎,于是被迫代替她去往敵國和親猴娩。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容