程式扎記: [ Python 文章收集 ] 常見檔案操作範例

標籤

2012年2月2日 星期四

[ Python 文章收集 ] 常見檔案操作範例

前言 : 
這裡將介紹常用的檔案操作, 例如如何使用 Python 一行行讀出檔案的內容, 判斷檔案是否存在 etc. 

檔案寫入 : 
範例一 : 從 Console 讀入並寫入檔案 
底下範例代碼先從 Console 讀入欲寫入檔案內容 (以直接 Enter 結束輸入) 並存在 list 中, 接著開啟檔案 test.dat 並寫入 : 
  1. # Create a file and write it to disk.  
  2. filename = "test.dat"  
  3.   
  4. # Let's create some data  
  5. done = 0  
  6. namelist = []  
  7. while not done:  
  8.     name = input("Enter a name: ")  # input() will remove trailing newline  
  9.     if name.strip() != "":  
  10.         namelist.append(name+"\n")  
  11.     else:  
  12.         break  
  13.   
  14. # Create a file object in "write" mode  
  15. FH = open(filename, "w")  
  16.   
  17. # Write all the lines at once to the file handle  
  18. FH.writelines(namelist)  
  19.   
  20. # Alternatively write them one by one  
  21. for name in namelist:  
  22.     FH.write(name)  
  23.   
  24. FH.close()  
範例二 : 常用檔案函數 (os.path 模組
>>> import os.path
>>> # os.path - The key to File I/O
... os.path.exists("test.dat")
True
>>> os.path.isfile("test.dat")
True
>>> os.path.isdir("test.dat")
False
>>> os.path.isabs("test.dat") # 是否為絕對路徑
False
>>> os.path.isabs("C:/tmp/test.dat")
True
>>> currentdir = os.curdir # This will be slightly different on each platform
>>> print(currentdir)
.
>>> print(os.path.join(currentdir, "images")) # 加入相對路徑 images
.\images

檔案讀取 : 
範例三 : 檔案讀取 
直覺寫法如下 
  1. file = open("sample.txt")  # 開啟檔案 handle  
  2.   
  3. while 1:  
  4.     line = file.readline()  
  5.     if not line:  # 檔案讀到結尾返回空白字串.  
  6.         break  
  7.     pass # do something  
這樣有點醜 ><". 可以透過 fileinput 模組寫出較簡潔代碼 : 
>>> import fileinput
>>> for line in fileinput.input("test.dat"):
... print("Line={0}".format(line.strip())) # strip() 用來將 trailing new line 移除!
...
Line=John
Line=Peter
Line=John
Line=Peter

看起來好像一切都很美好, 其實不然... 如果你考慮檔案 I/O 的話, 上面的效能並不是很好, 其實你可以一次讀入大量的資料到記憶體, 再從記憶體一行行處理資料以減少檔案 I/O : 
  1. file = open("sample.txt")  
  2.   
  3. while 1:  
  4.     lines = file.readlines(100000)  # 一次讀入大量資料 (100000 行). 如果已經讀到 EOF, 則 if 判斷會跳出 while loop  
  5.     if not lines:  
  6.         break  
  7.     for line in lines:  
  8.         pass # do something  
但是上面代碼還是很醜, 事實上在 Python 2.2 以後, file object 本身提供下面用法, 讓你可以代碼既簡潔效能也可以顧慮到 : 
>>> file = open("test.dat")
>>> for line in file:
... print("Line={0}".format(line.strip()))
...
Line=John
Line=Peter
Line=John
Line=Peter

>>> file.close() # 別忘了關閉檔案 handle!

目錄操作 : 
範例四 : 遍歷目錄內容 
底下會遍歷路徑 C:/tmp/ 下所有的檔案與目錄 : 
>>> import os.path
>>> rootdir = "C:/tmp"
>>> for parent, dirnames, filenames in os.walk(rootdir):
... print("parent is : "+parent)
... for dirname in dirnames:
... print("\tHas folder={0}".format(dirname))
... for filename in filenames:
... print("\tHas file={0}".format(filename))
...
parent is : C:/tmp\test5
Has folder=__pycache__
Has file=superman.py
parent is : C:/tmp\test5\__pycache__
Has file=superman.cpython-32.pyc

...(略)...

範例六 : 分割路徑與文件名 
底下分別介紹如何從一個檔案路徑分離出檔案名稱, 當前目錄, Driver 與副檔名 : 
>>> import os.path
>>> spath = "C:/tmp/test.dat"
>>> p, f=os.path.split(spath) # 分離目錄與檔案名稱
>>> print("dir is > "+p)
dir is > C:/tmp
>>> print("file is > "+f)
file is > test.dat
>>> drv, left = os.path.splitdrive(spath)
>>> print("driver is > "+drv)
driver is > C:
>>> print("left is > "+left)
left is > /tmp/test.dat
>>> f, ext = os.path.splitext(spath)
>>> print("f is : "+f)
f is : C:/tmp/test
>>> print("ext is : "+ext)
ext is : .dat

補充說明 : 
An Introduction to Python: File I/O 
Reading Text File 
Python 檔案操作技巧

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!