1. 程式人生 > >python 檔案和路徑操作函式小結

python 檔案和路徑操作函式小結

1.  檔案路徑的相關處理

用 os.path 就完全解決所有問題,包括路徑拼接、路徑拆分、相對路徑提取、檔案存在性判斷、檔案遍歷、遞迴遍歷等等。相關函式有:

os.path.join

os.path.basename

os.path.exists

os.makedirs

os.path.isdir

os.path.splitext

2. 檔案的遍歷

目錄下的檔案遍歷有兩種,一種是os.listdir,一種是用os.walk。如果需要遞迴,則後者更為方便。

 1: files = os.listdir(proj_dir)
 2: for f in files:
 3:     filepath = os.path.join(proj_dir,f)
 4:     if os.path.isdir(filepath): continue
 5:     if f.find('----')>-1:
 6:         shutil.copy(filepath, self.REPORT_DETAIL_DIR)

使用os.walk則很容易進行遍歷:

 1: for root,dirs,files in os.walk(proj_list_dir, True):
 2:     for f in files:
 3:         pass

3. 檔案的複製

對於檔案、資料夾、目錄樹的拷貝刪除可以使用shutil相關函式,注意有些條件,比如目標目錄不能存在之類。

shutil.copytree

shutil.rmtree

shutil.copy

4. 亂碼

如果能用utf-8統一處理是最好,但是如果在window下面,並且和平常檔案打交道多的話,可能也需要其他編碼。這時候需要注意系統的編碼格式。下面這段程式碼有幫助。

 1: default_encoding = 'gbk'
 2: if sys.getdefaultencoding() != default_encoding:
 3:
reload(sys)
 4:     sys.setdefaultencoding(default_encoding)

5. 配置檔案的讀寫

python內建了ConfigParser,一般的用途足夠了。簡潔好用。

6. 打包成exe

有時候為了部署方便,而且windows上預設也不會裝python,所以打包成一個獨立的exe還是相當有吸引力。以前的py2exe已經不維護了,不過現在有更簡單的 pyinstaller (www.pyinstaller.org),使用相當簡單,支援各種python版本。

需要留意的是,vc9的crt和upx有衝突,可以取消upx選項。

-------------------------------------------------------------------------------------

1: os.listdir(path) //path為目錄 

功能相當於在path目錄下執行dir命令,返回為list型別 
print os.listdir('..') 
2: os.path.walk(path,visit,arg) 
path :是將要遍歷的目錄 
visit :是一個函式指標,函式圓形為: 
callback(arg,dir,fileList) 
其中arg為為傳給walk的arg , dir是path下的一個目錄,fileList為dir下的檔案和目錄組成的list, arg:傳給visit用的 
3:os.path.split(path) 
path 為一個路徑, 
輸出,把path分成兩部分,具體看例項: 
print os.path.split("abc/de.txt") 
('abc', 'de.txt') 
os.path.split("abc") 
(", 'abc') 
print os.path.split("de/abc/de") 
('de/abc', 'de') 
4: os.path.splitext(filename) 
把檔名分成檔名稱和副檔名 
os.path.splitext(abc/abcd.txt) 
('abc/abcd', '.txt') 
5: os.path.dirname(path) 
把目錄名提出來 
print os.path.dirname("abc") 
#輸出為空 
print os.path.dirname('abc\def') 
abc 
6: os.path.basename(filename) 
取得主檔名 
print os.path.basename('abc') 
abc 
print os.path.basename('abc.txt') 
abc 
print os.path.basename('bcd/abc') 
abc #這個需要注意不包括目錄名稱 
print os.path.basename('.') 

7:os.mkdir(path, [mode]) 
path為目錄名: 這裡有個要求,只能建立一級目錄 
比如path為 abc/def 則當前目錄下必須存在abc 否則失敗 
8: os.makedirs(path [,mode]) 
可以建立多級目錄 
9:os.remove(path)刪除一個檔案,一定是一個檔案 
os.removedirs(path) 刪除一個目錄下所有東西 
os.rmdir(path) 刪除一個目錄,而且一定要空,否則os.errer 
10:os.walk(path) 
遍歷path,返回一個物件,他的每個部分都是一個三元組 
('目錄x',[目錄x下的目錄list],目錄x下面的檔案) 
舉例: 
a = os.walk('.') 
for i in a: 
print i 
11:shutil.copy(src,dst) 
把檔案src內容拷貝到檔案dst中。,目標區域必須可以寫,如果dst存在,則dst被覆蓋 
―――――――――――――――――― 
os.path -- 普通的路徑名操作 
這個模組實現一些在路徑名稱上有用的函式。 
警告:在 Windows 上,這些函式中的多個不能正確地支援 UNC 路徑名。splitunc() 和 ismount() 可以正確地處理它們。 
abspath(path) 
返回 path 路徑名一個規格化的絕對化的版本。在大多數平臺上,相當於normpath(join(os.getcwd(), path))。1.5.2版本中的新特性。 
basename(path) 
返回 path 路徑名最底部的名稱。這是由 split(path)返回的對的第二半部分。注意這個函式的結果不同於Unix basename 程式;UNIX的 basename對於'/foo/bar/' 返回 'bar',basename() 函式返回一個空字串('')。 
commonprefix(list) 
返回最長的路徑字首(採取字元的字元),是 list中所有路徑的一個字首。如果 list 為空,返回空字串('')。注意可以返回無效的路徑因為它每次操作一個字元。 
dirname(path) 
返回 path 路徑名的目錄名稱。這是由 split(path)返回的對的第一半部分。 
exists(path) 
如果 path 與一個已存在的路徑關聯返回True。對於損壞的符號連線返回 False 。在一些平臺上,如果許可權沒有被授予在請求的檔案上執行os.stat()這個函式可能返回False,即使該 path 實際上存在。 
lexists(path) 
如果 path 與一個已存在的路徑關聯返回 True 。對於損壞的連線返回 True 。在一些缺少 os.lstat()的平臺上相當於 exists() 。2.4版本中的新特性。 
expanduser(path) 
在 Unix上,返回 "~"或"~user"做為替換使用者的主目錄的開始部分的引數。開始的"~" 通過環境變數 HOME(如果它被設定)替換; 否則當前使用者的主目錄在口令目錄中通過內建模組 pwd被查詢。開始的"~user" 直接地在口令目錄中被查詢。 
在 Windows 上,僅支援 "~" ;它通過環境變數 HOME 或通過HOMEDRIVE 和 HOMEPATH的組合替換。 
如果該擴充失敗或如果該路徑不以一個波浪號開始,被返回的路徑無改變。 
expandvars(path) 
返回使用環境變數擴充的引數。"name""name"或"{name}"格式的子串通過環境變數 name 的值被替換。殘缺的變數名稱和引用不存在的變數被無改變的遺棄。 
getatime(path) 
返回 path 的最後訪問時間。返回的值是一個從新紀元開始的秒數(參見 time 模組)。如果檔案不存在或不可訪問掛起 os.error 。1.5.2版本中的新特性。2.3版本中的改變:如果 os.stat_float_times() 返回True,結果是一個浮點數。 
getmtime(path) 
返回 path 最後修改的時間。返回值是一個從新紀元開始的秒數(參見 time 模組)。如果檔案不存在或不可訪問掛起 os.error 。1.5.2版本中的新特性。2.3版本中的改變:如果 os.stat_float_times() 返回True,結果是一個浮點數。 
getctime(path) 
返回系統的 ctime ,在一些系統上 (像Unix) 是最後改變的時間,在其他一些系統上 (像Windows),是 path 建立的時間。返回值是一個從新紀元開始的秒數(參見 time 模組)。如果檔案不存在或不可訪問掛起 os.error 。2.3版本中的新特性。 
getsize(path) 
以位元組為單位,返回 path 的大小。如果檔案不存在或不可訪問掛起 os.error 。1.5.2版本中的新特性。 
isabs(path) 
如果 path 是一個絕對路徑名返回True (以一個斜槓開始)。 
isfile(path) 
如果 path 是一個已存在的普通檔案返回True 。這效仿符號連線,因此 islink() 和 isfile() 對於相同的路徑都可以返回 true 。 
isdir(path) 
如果 path 是一個已存在的目錄返回 True 。這效仿符號連結,因此 islink() 和 isdir() 對於相同的路徑都可以返回 true 。 
islink(path) 
如果 path 引用一個目錄項,它是一個符號連線,返回True。如果不支援符號連線始終返回 False 。 
ismount(path) 
如果路徑名 path是一個 掛載點 返回 True :在檔案系統中的那個點一個不同的檔案系統已經被掛載。這個函式檢測是否 path的父路徑, path/..,和 path 是一個不同的裝置,或是否 path/.. 和 path 在相同的裝置上指向相同的i-node -- 這應該是為所有的 Unix 和 POSIX 變種檢測掛載點。 
join(path1[, path2[, ...]]) 
智慧化地連線一個或多個路徑元件。如果任一元件是一個絕對路徑,所有前面的元件被丟棄(在Windows 上,包括前面的驅動器名,如果有) ,並且繼續連線。返回的值是 path1,和可選地 path2等的組合,正確地以一個目錄分隔符 (os.sep)插入到兩個元件之間,除非 path2 為空。注意在 Windows 上,因為每個驅動器有一個當前目錄,os.path.join("c:", "foo")表示相對於驅動器 C: 上的當前目錄的一個路徑(c:foo),而不是 c:\\foo。 
normcase(path) 
標準化一個路徑名的大小寫。在Unix上,返回未改變的路徑;在不區分大小寫的檔案系統上,它轉換路徑為小寫字母。在Windows上 ,它也轉換正斜槓為反斜槓。 
normpath(path) 
標準化一個路徑名。摺疊多餘(或冗長的)分隔符並且定位於外層引用,以致於 A//B,A/./B 和 A/foo/../B 都變成 A/B。它不標準化大小寫(標準化大小寫用 normcase())。在Windows上,它轉換正斜槓為反斜槓。如果它包含符號連線,它應該明白這可能改變路徑的意圖! 
realpath(path) 
返回指定的檔名標準的路徑,除去在路徑中遇到的任何符號連線(如果作業系統支援)。2.2版本中的新特性。 
samefile(path1, path2) 
如果路徑名引數與相同的檔案或目錄關聯返回 True (通過裝置號和 i-node 數表示)。如果 os.stat() 呼叫每個路徑名失敗掛起一個異常。有效的:Macintosh,Unix。 
sameopenfile(fp1, fp2) 
如果檔案描述符 fp1 和 fp2 與相同的檔案關連返回 True 。有效的:Macintosh,Unix。 
samestat(stat1, stat2) 
如果 stat 元組 stat1和stat2 與相同的檔案關連返回 True 。這個結構可能由fstat(),lstat(),或stat()返回。這個函式使用samefile() 和 sameopenfile()實現了基本的比較。有效的:Macintosh,Unix。 
split(path) 
分割路徑名 path 到一個對中,(head, tail)中 tail 是最後的路徑名元件head 是引導它的任何事物。tail 部分將一直都不包括斜線;如果 path 以一個斜線結尾,tail 將為空。如果 path 中沒有斜線,head 將為空。如果 path 為空,head 和 tail 都為空。尾隨斜線從 head 中被去除,除非它是根(one or more slashes only)。在幾乎所有的情況中,join(head, tail) 相當於 path (只有一個例外是當從 tail 中 head 被多個斜線分割時)。 
splitdrive(path) 
分割路徑名 path 到一個(drive, tail) 對中,drive 是每個驅動器的說明或空字串。在系統上不使用驅動器說明的,drive 將一直是空字元。在所有情況中,drive + tail 將和 path 相同。1.3版本中的新特性。 
splitext(path) 
分割路徑名 path 到一對 (root, ext) 中以致 root + ext == path,並且ext 為空或以一個句點開始並且只多包含一個句點。 
splitunc(path) 
分割路徑名 path 到一個對(unc, rest)中以便於 unc 是 UNC 掛載點 (諸如 r'\\host\mount'),如果,並且 rest 路徑的其餘部分(諸如 r'\path\file.ext')。對於路徑包含驅動器名,unc 將一直是空字元。有效的:Windows。 
walk(path, visit, arg) 
對於以 path 為根的目錄樹中的每一個目錄 (包含 path 自身,如果它是一個目錄),以引數 (arg, dirname, names)呼叫函式 visit 。引數 dirname 指定訪問的目錄,引數 names 列出在目錄中的檔案(從 os.listdir(dirname)中得到)。visit 函式可以修改 names 改變 dirname 下面訪問的目錄的設定,例如,避免訪問樹的某一部分。(由 names 關連的物件必須在合適的位置被修改,使用 del 或 slice 指派。) 
注意:符號連線到目錄不被作為一個子目錄處理,並且因此 walk()將不訪問它們。訪問連線的目錄你必須以os.path.islink(file) 和 os.path.isdir(file)標識它們,並且必須呼叫walk() 。

詳細出處參考:

from: http://www.cnblogs.com/wei-li/p/2502735.html