目錄和文件操做javascript
語言只有和外部連起來操做纔會實現更強大的功能,好比操做文件、數據庫等,這樣數據能夠有一塊單獨存儲的地方,而不是存放在內存中。更強大的是網絡編程,固然這些後續都會學習。接下來學習python對目錄和文件的操做。前面的筆記都是基礎理論知識,我以爲從這裏開始幾乎就能夠幹一些事了。html
有關文件夾與文件的查找,刪除等功能 在 os 模塊中實現。使用時需先導入這個模塊:import osjava
目錄python
一、取得當前目錄——os.getcwd()shell
>>> import os >>> s=os.getcwd()#得到當前運行腳本所在目錄 >>> s 'C:\\Python27'
好比運行test.py,那麼輸入該命令就會返回腳本所在的文件夾位置。數據庫
例如將test.py放入A文件夾。而且但願無論將A文件夾放在硬盤的哪一個位置,均可以在A文件夾內生成一個新文件夾。且文件夾的名字根據時間自動生成。編程
>>> import os >>> import time >>> folder = time.strftime(r"%Y-%m-%d_%H-%M-%S",time.localtime()) >>> os.makedirs(r'%s/%s'%(os.getcwd(),folder)) #建立以時間命名文件夾名
這是運行腳本的目錄即'C:\\Python27'下多了一個以當前時間命名的文件夾緩存
二、建立子目錄——os.makedirs("path"),path是要建立的子目錄網絡
>>> os.makedirs("C:\\temp\\test") #這是C盤下就建立了temp目錄,temp下嵌套的文件夾是test
(固然,也可能建立失敗,好比path已存在,或者驅動器不在,或者無寫權限等等)函數
三、更改當前目錄——os.chdir()
至關於dos或Linux下的cd命令
>>> os.chdir('c:\\') #將當前目錄改成C盤根目錄下
四、將路徑分解爲目錄名和文件名——os.path.split()
格式爲:fpath , fname = os.path.split( "要分解的路徑")
>>> a,b=os.path.split("c:\\dir1\\dir2\\file.txt") >>> print a c:\dir1\dir2 >>> print b file.txt
五、分解文件名的擴展名——os.path.splitext()
格式爲:fpath_name , ftext = os.path.splitext( "要分解的路徑")
>>> a,b=os.path.splitext("c:\\dir1\\dir2\\file.txt") >>> print a c:\dir1\dir2\file >>> print b file.txt
六、判斷一個路徑(目錄或文件)是否存在——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
七、判斷一個路徑是否有須要的文件——os.path.isfile("文件")
>>> os.path .isfile("C:\\test.txt") True >>> os.path .isfile("C:\\123.txt") False
八、判斷一個文件夾是否存在——os.path.isdir("路徑")
>>> os.path .isdir("C:\\") True >>> os.path .isdir("H:\\") False
九、獲取目錄中的文件及子目錄的列表——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']
示例:獲取指定目錄下的全部子目錄的列表
獲取指定目錄下全部文件的列表
十、刪除子目錄——os.rmdir("path"),只能刪除空目錄
>>> os.rmdir("C:\\temp\\test") #注意只刪除了test目錄 >>> os.rmdir("C:\\temp") #這裏才刪除了temp目錄
文件
python中模塊的引入使得對文件的操做變的很簡單。最基本的文件操做就是在文件中進行讀寫數據,在操做文件以前要打開文件。
打開文件——open('file'[,'mode'])
>>>import os
>>> os.getcwd() #取得當前目錄 'c:\\' >>> file=open('test.txt') #默認的mode是'r',即讀模式 >>> file.read() #讀取文件內容 'hello\nworld\nhello,python' # \n在文件中的形式是換行
mode的選項即含義以下:
模 式 |
描述 |
r |
以讀方式打開文件,可讀取文件信息。 |
w |
以寫方式打開文件,可向文件寫入信息。如文件存在,則清空該文件,再寫入新內容;若是文件不存在則建立 |
a |
以追加模式打開文件(即一打開文件,文件指針自動移到文件末尾),若是文件不存在則建立 |
r+ |
以讀寫方式打開文件,可對文件進行讀和寫操做。 |
w+ |
消除文件內容,而後以讀寫方式打開文件。 |
a+ |
以讀寫方式打開文件,並把文件指針移到文件尾。 |
b |
以二進制模式打開文件,而不是以文本模式。該模式只對Windows或Dos有效,類Unix的文件是用二進制模式進行操做的。 |
關於文件的其餘操做我以爲不必記錄的很詳細了,由於基本都很簡單,下面列出的是文件的經常使用方法,而且在例子中有相關說明。另外有一點注意的是讀取文件中常常存在的編碼問題。不一樣的解釋器默認的編碼不一樣,具體解決方案會再介紹。
常見文件操做方法:
方法 |
描述 |
f.close() |
關閉文件,記住用open()打開文件後必定要記得關閉它,不然會佔用系統的可打開文件句柄數。 |
f.name() |
獲取文件名稱 |
f.next() |
返回下一行,並將文件操做標記位移到下一行。把一個file用於for … in file這樣的語句時,就是調用next()函數來實現遍歷的。 |
f.fileno() |
得到文件描述符,是一個數字。返回一個長整型的」文件標籤「 |
f.flush() |
刷新輸出緩存,把緩衝區的內容寫入硬盤 |
f.isatty() |
若是文件是一個終端設備文件(Linux系統中),則返回True,不然返回False。 |
f.read([size]) |
讀出文件,size爲讀取的長度,以byte爲單位 |
f.readline([size]) |
讀出一行信息,若定義了size,則讀出 一行的一部分 |
f.readlines([size]) |
讀出全部行,也就是讀出整個文件的信息。(把文件每一行做爲一個list的一個成員,並返回這個list。其實它的內部是經過循環調用readline()來實現的。若是提供size參數,size是表示讀取內容的總長,也就是說可能只讀到文件的一部分) |
f.seek(offset[,where]) |
把文件指針移動到相對於where的offset位置。where爲0表示文件開始處,這是默認值 ;1表示當前位置;2表示文件結尾。(注意:若是文件以a或a+的模式打開,每次進行寫操做時,文件操做標記會自動返回到文件末尾) |
f.tell() |
得到文件指針位置,標記當前位置,以文件開頭爲原點 |
f.truncate([size]) |
把文件裁成規定的大小,默認的是裁到當前文件操做標記的位置。若是size比文件的大小還要大,依據系統的不一樣多是不改變文件,也多是用0把文件補到相應的大小,也多是以一些隨機的內容加上去。 |
f.write(string) |
把string字符串寫入文件,write()不會在str後加上一個換行符。 |
f.writelines(list) |
把list中的字符串一行一行地寫入文件,是連續寫入文件,沒有換行。 |
現有一個test.txt文件,格式以下:
hello
world
hello
python
|
下面是一些常見操做:
>>> file=open('test.txt') >>> file.read (4) #讀取前4個字節 'hell' >>> file.read(6) #注意這裏是在剛纔讀過的基礎上再向後讀的 'o\nworl' >>> file.read () #不指定size,則讀到文件結尾 'd\nhello\npython' >>> file.read() #再讀時已經是文件結尾 '' >>> file.seek(0) #將文件位置定位到第一個字節 >>> file.readline () #一次讀一行 'hello\n' >>> file.readline () 'world\n' >>> file.seek(0) #將文件定位到開始 >>> file.readlines () #讀取整個文件的內容 ['hello\n', 'world\n', 'hello\n', 'python']
>>> file .tell() #讀完以後顯示seek位置,即文件的最後了
27L #以長整型表示
>>> file.name #查看文件的名稱
'test.txt'
>>> file.close() #關閉文件
剛開始測試read和readline等用法的時候,由於只要讀取一次就在上次基礎上日後讀,當時我還覺得這是一個出棧操做,顯然,知道有seek這個方法後,我才知道它不是,只是每次讀的時候seek的位置就日後移動一個,而每次讀取是以seek所在的位置爲起點的。因此若是須要從頭開始讀取文件內容時,將文件位置設爲開始便可,即seek(0)。
>>> file=open('test.txt','w') >>> file.write ('\nwelcome') #會將以前的內容覆蓋 >>> file.writelines ('I love python') >>> file.close () #關閉文件時才能看到文件內容的修改
>>> file=open('test.txt','a') #追加到文件尾,而不會覆蓋 >>> file.writelines ('this is a test') >>> file.close()
對文件的相關操做有時須要引入shutil模塊:
>>> import shutil >>> shutil.copyfile('test.txt','123.txt') #參數只能是文件 >>> shutil.copy("olddir","newfileordir") #olddir只能是文件夾,newfile能夠是文件,也能夠是目標目錄 >>> shutil.copytree("olddir","newdir") #olddir和newdir都只能是目錄,且newdir必須不存在 >>> shutil.move("oldpos","newpos") #移動文件或目錄 >>> shutil.rmtree("dir") #空目錄、有內容的目錄均可以刪 >>> import os
>>> os.rmdir("dir") #只能刪除空目錄 >>> os.remove("file") #刪除文件 >>> os.rename("oldname","newname") #文件或目錄都是使用這條命令
關於文件和目錄操做的總結,推薦博客:http://www.cnblogs.com/rollenholt/archive/2012/04/23/2466179.html
文件編碼:
#得到當前環境默認編碼 >>> import sys >>> import locale >>> sys.getdefaultencoding() # 返回當前系統所使用的默認字符編碼 'ascii' >>> sys.getfilesystemencoding () # 返回用於轉換Unicode文件名至系統文件名所使用的編碼 'mbcs' >>> locale.getdefaultlocale() # 獲取默認的區域設置並返回元組(語言, 編碼) ('zh_CN', 'cp936') >>> locale .getpreferredencoding () # 返回用戶設定的文本數據編碼 'cp936'
推薦博客:http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html