1. 程式人生 > >《Python程式設計從入門到實踐》記錄之讀取檔案

《Python程式設計從入門到實踐》記錄之讀取檔案

目錄

1、讀取整個檔案

2、檔案路徑

3、逐行讀取檔案

4、建立包含檔案各行內容的列表並使用它


從檔案讀取資料有兩種方式:(1)一次性讀取整個檔案的全部內容;(2)以每次一行的方式逐步讀取。


1、讀取整個檔案

假設有一個文字檔案,包含精確到小數點後30位的圓周率值,且在小數點後每10位處換行,命名為:pi_digits.txt。下邊示例是開啟並讀取這個檔案,再將其內容顯示到螢幕上:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

with open('pi_digits.txt') as file_object:
    contents = file_object.read()
    print(contents)

執行結果:

程式碼分析讀取檔案方法:

open()函式:

  • 用來開啟檔案,必須的操作,因為以任何方式使用檔案,必須得開啟檔案,這樣才能訪問檔案。
  • open()函式接受一個引數:開啟的檔案的名稱
  • open()函式返回一個表示檔案的物件,需要將其儲存在一個變數中

關鍵字with:

  • 關鍵字with的作為是在不再需要訪問檔案後將其自動關閉,同close()函式作用相同。
  • close()函式需要手動關閉檔案,可能會出現一些問題。使用with關鍵字,使得我們只管開啟檔案,在需要時候使用檔案,Python會在合適的時候自動將其關閉。

read()函式:

  • read()函式讀取檔案全部內容(整個檔案),並將其作為一個長長的字串儲存在變數contents變數中。

輸出空行:

  • 輸出時,會多一個空行,因為read()達到末尾時返回一個空字串,這個空字串顯示出來就是一個空行。要刪除末尾的空行,可以使用先前介紹的rstrip()函式來刪除。(如下程式碼所示)

刪除空行

#!/usr/bin/env python
# -*- coding:utf-8 -*-

with open('pi_digits.txt') as file_object:
    contents = file_object.read()
    print(contents.rstrip())  # 刪除空行

執行結果: 


2、檔案路徑

如果檔案和執行程式的檔案在同一個目錄中,則只需向open()函式傳遞檔名即可。但若需要開啟的檔案與執行程式不在同一個目錄中,則在呼叫open()函式時,需要傳遞需要開啟檔案的具體路徑

區分是否在同一目錄,只需看兩個的目錄資訊,只有完全相同,才能算是在同一個目錄,否則就是不在同一個目錄。

Windows系統中,在檔案路徑中使用反斜槓(\)而不是使用斜槓(/)

檔案路徑有相對路徑和絕對路徑之分:

  • 相對路徑:假設上述程式碼在python_work中,文字檔案pi_digits.txt在python_work中的一名為text_file中,則可以使用“text_file\pi_digits.txt”來作為引數傳遞給open函式,這就叫相對路徑
  • 絕對路徑:就是檔案的完整程式碼,這種路徑最靠譜,一般不會出錯,實際應用中,可以考慮使用此種路徑。絕對路徑相對比較長,因此可以將其儲存在一個變數中,再將變數傳遞給open()函式。如下所示:

file_path = ‘C:\Users\ehmatthes\other_file\text_file\filename.txt’

with open(file_path) as file_object:


3、逐行讀取檔案

要以每次一行的方式讀取檔案,可對檔案物件使用for迴圈:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

with open('pi_digits.txt') as file_object:
    for line in file_object:
        print(line.rstrip())   # 同樣會有空白行,使用rstrip刪除空白行

執行結果:


4、建立包含檔案各行內容的列表並使用它

使用關鍵字with時,open()返回的檔案物件只在with程式碼塊內使用。如果要在with程式碼塊外訪問檔案的內容,可在with程式碼塊內將檔案的各行儲存在一個列表中

下邊例子,建立一個列表儲存檔案物件,建立一個字串,包含檔案中儲存的所有數字,且沒有任何空格:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

with open('pi_digits.txt') as file_object:
    lines = file_object.readlines()  # 讀取每一行,並存儲在lines列表中

pi_string = ''
pi_string1 = ''

for line in lines:
    pi_string += line.rstrip()  # 刪除空行,但並未刪除左邊的空格
    pi_string1 += line.strip()  # 刪除空行和空格

print(pi_string)
print('pi_string長度為:' + str(len(pi_string)))

print(pi_string1)
print('pi_string1長度為:' + str(len(pi_string1)))

執行結果:


!!!注意:讀取文字檔案,Python將其中的所有文字都解讀為字串。如果讀取的是數字,並要將其作為數值使用,就必須使用函式int()或float()將其轉換為數值。