1. 程式人生 > 其它 >Python基礎: 檔案

Python基礎: 檔案

技術標籤:Pythonpython

從檔案中地區資料

要使用文字檔案中的資訊,首先需要將資訊讀取到記憶體中。為此,你可以一次性讀取檔案的全部內容,也可以以每次一行的方式逐步讀取。

讀取整個檔案

要讀取檔案,需要一個包含幾行文字的檔案。下面首先來建立一個檔案,它包含精確到小數點後30位的圓周率值,且在小數點後每10位處都換行:
pi_digits.txt

3.1415926535
 8979323846
 2643383279

下面的程式開啟並讀取這個檔案,再將其內容顯示到螢幕上:
file_reader.py

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

在這裡插入圖片描述
在這個程式中,第1行程式碼做了大量的工作。我們先來看看函式open() 。要以任何方式使用檔案——哪怕僅僅是列印其內容,都得先開啟打 檔案,這樣才能訪問它。函式open() 接受一個引數:要開啟的檔案的名稱。Python在當前執行的檔案所在的目錄中查詢指定的檔案。在這個示例中,當前執行的是file_reader.py,因此Python在file_reader.py所在的目錄中 查詢pi_digits.txt。函式open() 返回一個表示檔案的物件。在這裡,open(‘pi_digits.txt’) 返回一個表示檔案pi_digits.txt 的物件;Python將這個物件儲存在我們將 在後面使用的變數中。

關鍵字with 在不再需要訪問檔案後將其關閉。在這個程式中,注意到我們呼叫了open() ,但沒有呼叫close() ;你也可以呼叫open() 和close() 來開啟和關閉檔案,但 這樣做時,如果程式存在bug,導致close() 語句未執行,檔案將不會關閉。這看似微不足道,但未妥善地關閉檔案可能會導致資料丟失或受損。如果在程式中過早地調 用close() ,你會發現需要使用檔案時它已關閉(無法訪問),這會導致更多的錯誤。並非在任何情況下都能輕鬆確定關閉檔案的恰當時機,但通過使用前面所示的結構,可讓Python去確定:你只管開啟檔案,並在需要時使用它,Python自會在合適的時候自動將其關閉。

有了表示pi_digits.txt的檔案物件後,我們使用方法read() (前述程式的第2行)讀取這個檔案的全部內容,並將其作為一個長長的字串儲存在變數contents 中。這樣,通過 列印contents 的值,就可將這個文字檔案的全部內容顯示出來

相比於原始檔案,該輸出唯一不同的地方是末尾多了一個空行。為何會多出這個空行呢?因為read() 到達檔案末尾時返回一個空字串,而將這個空字串顯示出來時就是一 個空行。要刪除多出來的空行,可在print 語句中使用rstrip()

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

Python方法rstrip() 刪除字串末尾的空白。現在,輸出與原始檔案的內容完全相同.

檔案路徑

當你將類似pi_digits.txt這樣的簡單檔名傳遞給函式open() 時,Python將在當前執行的檔案(即.py程式檔案)所在的目錄中查詢檔案。

根據你組織檔案的方式,有時可能要開啟不在程式檔案所屬目錄中的檔案。例如,你可能將程式檔案儲存在了資料夾python_work中,而在資料夾python_work中,有一個名為 text_files的資料夾,用於儲存程式檔案操作的文字檔案。雖然資料夾text_files包含在資料夾python_work中,但僅向open() 傳遞位於該資料夾中的檔案的名稱也不可行,因為Python 只在資料夾python_work中查詢,而不會在其子資料夾text_files中查詢。要讓Python開啟不與程式檔案位於同一個目錄中的檔案,需要提供檔案路徑 文 ,它讓Python到系統的特定位置 去查詢。

由於資料夾text_files位於資料夾python_work中,因此可使用相對檔案路 相 徑來開啟該資料夾中的檔案。相對檔案路徑讓Python到指定的位置去查詢,而該位置是相對於當前執行的程 序所在目錄的。在Linux和OSX中,你可以這樣編寫程式碼:
with open('text_files/filename.txt') as file_object:
這行程式碼讓Python到資料夾python_work下的資料夾text_files中去查詢指定的.txt檔案。在Windows系統中,在檔案路徑中使用反斜槓(\ )而不是斜槓(/ ):
with open('text_files\filename.txt') as file_object:

你還可以將檔案在計算機中的準確位置告訴Python,這樣就不用關心當前執行的程式儲存在什麼地方了。這稱為絕對檔案路徑 。在相對路徑行不通時,可使用絕對路徑。例如, 如果text_files並不在資料夾python_work中,而在資料夾other_files中,則向open() 傳遞路徑’text_files/ filename.txt’ 行不通,因為Python只在資料夾python_work中查詢 該位置。為明確地指出你希望Python到哪裡去查詢,你需要提供完整的路徑。

絕對路徑通常比相對路徑更長,因此將其儲存在一個變數中,再將該變數傳遞給open() 會有所幫助。在Linux和OS X中,絕對路徑類似於下面這樣:

file_path = '/home/ehmatthes/other_files/text_files/filename.txt' with open(file_path) as file_object:

而在Windows系統中,它們類似於下面這樣:

file_path = 'C:\Users\ehmatthes\other_files\text_files\filename.txt' with open(file_path) as file_object:

通過使用絕對路徑,可讀取系統任何地方的檔案。就目前而言,最簡單的做法是,要麼將資料檔案儲存在程式檔案所在的目錄,要麼將其儲存在程式檔案所在目錄下的一個檔案 夾(如text_files)中。

逐行讀取

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

file_name = 'pi_digits.txt'
with open(file_name) as file_object:
    for line in file_object:
        print(line)

我們列印每一行時,發現空白行更多了:
在這裡插入圖片描述
為何會出現這些空白行呢?因為在這個檔案中,每行的末尾都有一個看不見的換行符,而print 語句也會加上一個換行符,因此每行末尾都有兩個換行符:一個來自檔案,另一 個來自print 語句。要消除這些多餘的空白行,可在print 語句中使用rstrip()

file_name = 'pi_digits.txt'
with open(file_name) as file_object:
    for line in file_object:
        print(line.rstrip())

在這裡插入圖片描述

建立一個包含檔案各行內容的列表

使用關鍵字with 時,open() 返回的檔案物件只在with 程式碼塊內可用。如果要在with 程式碼塊外訪問檔案的內容,可在with 程式碼塊內將檔案的各行儲存在一個列表中,並 在with 程式碼塊外使用該列表:你可以立即處理檔案的各個部分,也可推遲到程式後面再處理。

下面的示例在with 程式碼塊中將檔案pi_digits.txt的各行儲存在一個列表中,再在with 程式碼塊外列印它們:

file_name = 'pi_digits.txt'
with open(file_name) as file_object:
    lines = file_object.readlines()

for line in lines:
    print(line.rstrip())

在這裡插入圖片描述

使用檔案的內容

將檔案讀取到記憶體中後,就可以以任何方式使用這些資料了。下面以簡單的方式使用圓周率的值。首先,我們將建立一個字串,它包含檔案中儲存的所有數字,且沒有任何空格:

file_name = 'pi_digits.txt'
with open(file_name) as file_object:
    lines = file_object.readlines()

pi_string = ""
for line in lines:
    pi_string += line.rstrip()

print(pi_string)
print(len(pi_string))

在這裡插入圖片描述
在變數pi_string 儲存的字串中,包含原來位於每行左邊的空格,為刪除這些空格,可使用strip() 而不是rstrip() :

file_name = 'pi_digits.txt'
with open(file_name) as file_object:
    lines = file_object.readlines()

pi_string = ""
for line in lines:
    pi_string += line.strip()

print(pi_string)
print(len(pi_string))

在這裡插入圖片描述
注意:讀取文字檔案時,Python將其中的所有文字都解讀為字串。如果你讀取的是數字,並要將其作為數值使用,就必須使用函式int() 將其轉換為整數,或使用 函式float() 將其轉換為浮點數。

寫入檔案

儲存資料的最簡單的方式之一是將其寫入到檔案中。通過將輸出寫入檔案,即便關閉包含程式輸出的終端視窗,這些輸出也依然存在:你可以在程式結束執行後檢視這些輸出, 可與別人分享輸出檔案,還可編寫程式來將這些輸出讀取到記憶體中並進行處理。

寫入空檔案

file_name = 'programming.txt'

with open(file_name, 'w') as file_object:
    file_object.write('I love programming.')

在這個示例中,呼叫open() 時提供了兩個實參。第一個實參也是要開啟的檔案的名稱;第二個實參(‘w’ )告訴Python,我們要以寫入模式 寫 開啟這個檔案。開啟檔案 時,可指定讀取模式 讀 (‘r’ )、寫入模式 寫 (‘w’ )、附加模式 (‘a’ )或讓你能夠讀取和寫入檔案的模式(‘r+’ )。如果你省略了模式實參,Python將以預設的只讀模式開啟檔案。
在這裡插入圖片描述
相比於你的計算機中的其他檔案,這個檔案沒有什麼不同。你可以開啟它、在其中輸入新文字、複製其內容、將內容貼上到其中等。

注意: Python只能將字串寫入文字檔案。要將數值資料儲存到文字檔案中,必須先使用函式str() 將其轉換為字串格式。

寫入多行

函式write() 不會在你寫入的文字末尾新增換行符,因此如果你寫入多行時沒有指定換行符,檔案看起來可能不是你希望的那樣:

file_name = 'programming.txt'

with open(file_name, 'w') as file_object:
    file_object.write('I love programming.')
    file_object.write("I love creating new games.")

如果你開啟programming.txt,將發現兩行內容擠在一起:
在這裡插入圖片描述
要讓每個字串都單獨佔一行,需要在write() 語句中包含換行符:

file_name = 'programming.txt'

with open(file_name, 'w') as file_object:
    file_object.write('I love programming.\n')
    file_object.write("I love creating new games.\n")

現在,輸出出現在不同行中:
在這裡插入圖片描述
像顯示到終端的輸出一樣,還可以使用空格、製表符和空行來設定這些輸出的格式。

附加到檔案

如果你要給檔案新增內容,而不是覆蓋原有的內容,可以附加模式 附 開啟檔案。你以附加模式開啟檔案時,Python不會在返回檔案物件前清空檔案,而你寫入到檔案的行都將新增 到檔案末尾。如果指定的檔案不存在,Python將為你建立一個空檔案。

下面來修改write_message.py,在既有檔案programming.txt中再新增一些你酷愛程式設計的原因:

file_name = 'programming.txt'

with open(file_name, 'a') as file_object:
    file_object.write("I also love finding meaning in large datasets.\n")
    file_object.write("I love creating apps that can run in a browser.\n")

在這裡插入圖片描述
最終的結果是,檔案原來的內容還在,它們後面是我們剛新增的內容。