Python學習筆記(七)——文件和目錄操作

 目錄和文件操作

  語言只有和外部連起來操作纔會實現更強大的功能,比如操作文件、數據庫等,這樣數據可以有一塊單獨存儲的地方,而不是存放在內存中。更強大的是網絡編程,當然這些後續都會學習。接下來學習python對目錄和文件的操作。前面的筆記都是基礎理論知識,我覺得從這裏開始幾乎就可以幹一些事了。

  有關文件夾與文件的查找,刪除等功能 在 os 模塊中實現。使用時需先導入這個模塊:import  os

                             目錄

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

>>> 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'下多了一個以當前時間命名的文件夾

2、創建子目錄——os.makedirs("path"),path是要創建的子目錄

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

(當然,也可能創建失敗,比如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")
>>> print a
c:\dir1\dir2
>>> print b
file.txt

5、分解文件名的擴展名——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
.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']

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

 

>>> def getDirList( p ):

        p = str( p )

        if p=="":

              return [ ]

        p = p.replace( "/","\\")

        if p[ -1] != "\\":

             p = p+"\\"

        a = os.listdir( p )

        b = [ x   for x in a if os.path.isdir( p + x ) ]

        return b



>>> getDirList( "C:\\" )

['$Recycle.Bin', '360rescue', '360SANDBOX', '360SysRt', 'Boot', 'CacheTemp', 'Documents and Settings', 'inetpub', 'MSOCache', 'Program Files', 'Program Files (x86)', 'ProgramData', 'Python27', 'Recovery', 'RECYCLER', 'System Volume Information', 'Users', 'Windows']

 

 

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

>>> def getFileList( p ):
        p = str( p )
        if p=="":
              return [ ]
        p = p.replace( "/","\\")
        if p[ -1] != "\\":
             p = p+"\\"
        a = os.listdir( p )
        b = [ x   for x in a if os.path.isfile( p + x ) ]
        return b
 
>>> getFileList( "C:\\" )
['360ld', 'bootmgr', 'BOOTSECT.BAK', 'grldr', 'IFRToolLog.txt', 'pagefile.sys', 'SBTDR', 'test.txt']

10、刪除子目錄——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'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章