Python

Python利用資料檔保存數值資料

很多人使用Python來進行文字資料的處理,而文字資料最大的來源除了網頁之外,再來就是一大堆的文字檔,在本篇文章中就讓我們來為初學Python的同學們說明,如何在Python中處理資料檔案。

首先,先來看存檔的部份。假設我們需要一個程式協助我們把一些從鍵盤輸入的數字資料儲存起來,可以使用以下的程式:

scores = list()
score = int(input("Score="))
while score >=0:
    scores.append(score)
    score = int(input("Score="))
print(scores)

上面這個程式可以讓使用者不斷地輸入數字,只要數字大於等於0就把數字放到串列中,在輸入負數之後,就會結束輸入,並把之前所有輸入的數字顯示出來。

儘管我們把輸入的所有數字都保存起來了,但是保存的地方是記憶體變數中,當程式結束執行之後,所有的資料就都不見了,下次使用這些數字時需要再一次輸入。為了把這些數字保存起來讓下一次可以使用,輸要利用open()函式,把這些資料寫到檔案中才行。請參考以下的例子:

scores = list()
score = int(input("Score="))
while score >=0:
    scores.append(score)
    score = int(input("Score="))
filename = input("請輸入要保存的檔案名稱:")
fp = open(filename, "w")
for score in scores:
    fp.write(str(score))
fp.close()

如同學們看到的,一開始利用「fp = open(filename, “w")」建立了一個檔案物件,開啟一個檔案作為寫入之用,之後就可以利用fp.write()函式把數字逐筆寫入。但由於文字檔的寫入資料必須是字串型式,因此在寫入之後還是呼叫str()函式進行數字到字串的轉換。假設以下是上述程式的執行過程:

則在此程式執行之後,開啟data01.txt,可以得到以下的資料:

103049583456

你沒看錯,所有的數字全部都串接在一起,分不出資料項目到底有幾個。會這樣的原因是因為在write()寫入字串時並沒有加上分隔符號的關係,當然,這樣的資料是沒有用處的。為了避免此種情形的發生,我們需要把程式改為如下所示的樣子:

scores = list()
score = int(input("Score="))
while score >=0:
    scores.append(score)
    score = int(input("Score="))
filename = input("請輸入要保存的檔案名稱:")
fp = open(filename, "w")
for score in scores:
    fp.write(str(score))
    fp.write("\n")
fp.close()

我們只有在fp.write(str(score))的後面加上一個fp.write(“\n"),也就是加上一個換列符號,則同樣的輸入資料,即可以得到如下所示的結果:

10
30
49
58
34
56

等於是每存入一個數字資料都換列,如此就可以輕易地辨識出每一個數字資料了。那麼,有了資料檔案(假設儲存在data02.txt中),該如何把這些資料正確地取出呢?請參考以下的程式:

filename = input("請輸入要讀取的檔案名稱:")
fp = open(filename, "r")
scores = fp.readlines()
fp.close()
print(scores)

以下是執行的過程和輸出的結果:

由此可以看到我們把所有的資料都以字串的格式讀取出來了。那麼,如何把它們變回數字,然後再進行計算呢?請看以下的程式:

filename = input("請輸入要讀取的檔案名稱:")
fp = open(filename, "r")
scores = fp.readlines()
fp.close()
data = list()
for score in scores:
    data.append(int(score))
print(max(data))
print(min(data))
print(sum(data)/len(data))

在上述的程式中,我們把取得的字串串列資料再逐一取出,轉換成整數之後再放到data串列中,最後data中就是所有轉換後的數值串列。既然是數值串列,就可以利用串列的最大值(max)、最小值(min)、總和(sum)、計算個數(len)函數進行計算,找出串列中的最大、最小、以及平均值。上的程式執行過程及結果如下:

由於轉換串列的作業是資料處理中很常見的作業,因此Python有提供一個串列生成式(list comprehension)的簡化寫法,功能一樣,但是程式碼簡潔多了,請參考以下的程式:

filename = input("請輸入要讀取的檔案名稱:")
fp = open(filename, "r")
scores = fp.readlines()
fp.close()
scores = [int(score) for score in scores]
print(max(scores))
print(min(scores))
print(sum(scores)/len(scores))

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s