1. 程式人生 > >Python檔案&IO處理技巧(1): 讀寫、重定向、間隔符、路徑、存在性與檔案列表

Python檔案&IO處理技巧(1): 讀寫、重定向、間隔符、路徑、存在性與檔案列表

1. 文字資料的讀寫

  • open() & write() : rt模式的重新整理模式

當我們需要讀寫各種不同編碼的文字資料(如ASCII,UTF-8或UTF-16編碼等), 可以直接使用帶rt模式的open()內建函式。如果需要將文字內容寫入到一個檔案中,就要使用帶有 wt 模式的 write() 函式。如果檔案不存在,系統就會新建一個檔案;如果先前檔案中存在內容,那麼也會被強制重新整理。

# 將整個文件作為字串讀進來
with open('test.txt', 'rt') as f:
    data = f.read() 

#迭代模式 按行讀取文件內容
with open('test.txt', 'rt') as f:
    for line in f:
        print(line)

text = 'why do you want to go abroad?'
with open('test_w.txt', 'wt') as f:
    f.write(text)
  • open() + at模式:已存在檔案新增內容

檔案的讀寫操作預設使用系統編碼,可以通過呼叫 sys.getdefaultencoding() 來得到。 在大多數機器上面都是utf-8編碼。如果你已經知道你要讀寫的文字是其他編碼方式, 那麼可以通過傳遞一個可選的 encoding 引數給open()函式。

Note:

1.使用with語句是為了給檔案建立了一個上下文環境, 但 with 控制塊結束時,檔案會自動關閉。也可以不使用 with 語句,但是這時候你就必須記得手動關閉檔案,f.close()。

2.關於換行符的識別問題,在Unix和Windows中是不一樣的(分別是 \n 和 \r\n)。 預設情況下,Python會以統一模式處理換行符。 這種模式下,在讀取文字的時候,Python可以識別所有的普通換行符並將其轉換為單個 \n 字元。

2. 列印輸出到檔案中

print() 函式中指定 file 關鍵字引數,可以將待寫入文件的內容重定向到該文件中。

  • print() & paras: file
with open('test_w.txt', 'wt') as f:
    print('My dream!', file = f)

Note: 檔案必須是以文字模式開啟。 如果檔案是二進位制模式的話,列印就會出錯。

3. 使用其他分隔符或行終止符列印

很多時候,我們在用print() 函式輸出資料時,希望改變間隔符或者行終止符。這時候可以使用在 print() 函式中使用 sep 和 end 關鍵字引數。

# default
print('ziheng', 22, 3.14)
# >>> ziheng 22 3.14
print('ziheng', 22, 3.14, sep = ',')
# >>> ziheng,22,3.14
print('ziheng', 22, 3.14, sep = ',', end = '??\n')
# >>> ziheng,22,3.14??

# 使用end引數 還可以讓輸出禁止換行
for num in range(5):
    print(num)
    
for num in range(5):
    print(num, end = ',')
# >>> 0,1,2,3,4,

4. 檔案路徑名操作

如何通過檔案路徑名獲得檔名、目錄名以及絕對路徑?

  • os.path
import os
path = 'D:\\使用者目錄\\我的文件\\pythonPro\\test.txt'
print(os.path.basename(path))
# >>> test.txt
print(os.path.dirname(path))
# >>> D:/使用者目錄/我的文件/pythonPro

# 提供新的檔案目錄
print( os.path.join(os.path.dirname(path), 'newFile',os.path.basename(path)))
# >>> D:\使用者目錄\我的文件\pythonPro\newFile\test.txt

# 檔案字尾名
print(os.path.splitext(path))
# >>> ('D:\\使用者目錄\\我的文件\\pythonPro\\test', '.txt')

對於任何的檔名的操作,都使用 os.path 模組。 特別是為了可移植性考慮, 因為 os.path 模組知道Unix和Windows系統之間的差異並且能夠可靠地處理類似 Data/data.csv 和 Data\data.csv 這樣的檔名。 

5. 檔案的存在性

在應用程式中,特別是讀寫檔案之前,我們應該判斷檔案是否存在。

  • os.path.exists
import os

print( os.path.exists('test.txt'))
# >>> True
print( os.path.isfile('test.txt'))
# >>> True

print( os.path.exists('D:\\使用者目錄'))
# >>> True
print( os.path.isdir('D:\\使用者目錄'))
# >>> True

使用 os.path 來進行檔案測試是很簡單的。唯一需要注意的就是你需要考慮檔案許可權的問題,特別是在獲取元資料時候(這裡說的元資料指的是:檔案大小getsize / 檔案時間getmtime)。

6. 獲取檔案列表

獲取檔案系統中某個檔案目錄下所有的檔案。結果會返回目錄中所有檔案列表,包括所有檔案,子目錄,符號連結等等。 如果需要通過某種方式過濾資料,可以結合 os.path 庫中的一些函式來使用列表推導。

  • os.listdir
import os
name = 'D:\\使用者目錄\\我的文件'
print( os.listdir(name) )
# >>> ['desktop.ini', 'pythonPro', 'Tencent Files', 'test1.txt']

# 檔案過濾 -> 得到所有檔案
files = [num for num in os.listdir(name) 
        if os.path.isfile(os.path.join(name, num))]
print( files )
# >>> ['desktop.ini', 'test1.txt']

# 檔案過濾 -> 得到所有資料夾
filefold = [num for num in os.listdir(name)
        if os.path.isdir(os.path.join(name, num))]
print( filefold )
# >>> ['pythonPro', 'Tencent Files']

# 檔案過濾 -> 獲取特定型別檔案
txtfiles = [num for num in os.listdir(name)
            if num.endswith('.txt')]
print(txtfiles)
# >>> ['test1.txt']

獲取目錄中的列表很容易,但是其返回結果只是目錄中實體名列表而已。 如果還想獲取其他的元資訊,比如檔案大小,修改時間等等, 還需要使用到 os.path 模組中的函式或著 os.stat() 函式來收集資料。

文章參考《Python3-cookbook》