前言 : 這裡將介紹常用的檔案操作, 例如如何使用 Python 一行行讀出檔案的內容, 判斷檔案是否存在 etc. 檔案寫入 : 範例一 : 從 Console 讀入並寫入檔案 底下範例代碼先從 Console 讀入欲寫入檔案內容 (以直接 Enter 結束輸入) 並存在 list 中, 接著開啟檔案 test.dat 並寫入 :
- # Create a file and write it to disk.
- filename = "test.dat"
-
- # Let's create some data
- done = 0
- namelist = []
- while not done:
- name = input("Enter a name: ") # input() will remove trailing newline
- if name.strip() != "":
- namelist.append(name+"\n")
- else:
- break
-
- # Create a file object in "write" mode
- FH = open(filename, "w")
-
- # Write all the lines at once to the file handle
- FH.writelines(namelist)
-
- # Alternatively write them one by one
- for name in namelist:
- FH.write(name)
-
- 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
檔案讀取 : 範例三 : 檔案讀取 直覺寫法如下
- file = open("sample.txt") # 開啟檔案 handle
-
- while 1:
- line = file.readline()
- if not line: # 檔案讀到結尾返回空白字串.
- break
- 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 :
- file = open("sample.txt")
-
- while 1:
- lines = file.readlines(100000) # 一次讀入大量資料 (100000 行). 如果已經讀到 EOF, 則 if 判斷會跳出 while loop
- if not lines:
- break
- for line in lines:
- 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 檔案操作技巧
沒有留言:
張貼留言