用 Python 讀取 txt 檔案

前面我們使用Python來開啟與儲存檔案,現在我們要來做相反的動作,我們要把存在記事本裡面的檔案讀到程式中,儲存與讀取是一體兩面的事情,首先我們先創建一份記事本檔案,我把檔名取作 Python_reading

首先,我們要先讀取檔案出來:

f = open(r'E:/Python_reading.txt')
f.readlines()
f.close()

大家可以看到我們就把記事本中的三行文字都讀出來囉~另外大家看到 ” \n ” 不知道有沒有問題,在程式語言中, ” \n ” 指的是換行的意思,也就是在記事本中按下enter後,換航其實做的就是在剛剛的那段文字中加上” \n “,而程式在讀取的時候就會自動換行顯示給我們看。

接著如果是想要一行一行讀取呢?

利用readline()可以只讀取一行,而且再次使用的話他會變成讀取下一行,這種做法可以讓我們一行一行的閱讀記事本裡面的內容,但如果我們要一次把一行一行的資料取出來的話,我們可以利用for迴圈來完成:

f = open(r'E:/Python_reading.txt')
for line in f:
    print(line, end="")

上面就把整份記事本中的文字給讀出來了。不過這這樣其實也不夠好用,因為他只是單純印出來,所以我們可以用 list 的方式存起來。這樣我們就可以指定取出我們要的某一句。

f = open(r'E:/Python_reading.txt')
text = []
for line in f:
    text.append(line)
print(text)

接下來我們就可以依照我們想要的方式叫出來:

print(text[1])
print(text[0])
print(text[2])

順道提醒一下,在 list 當中,第一筆資料是 [0] 開始算起。所以我們就可以隨心所欲的 call出我們要的資料囉~~

以上就是我們把資料讀到 Python 中的方式,利用 Python 中的檔案存檔與讀取,就可以組合出許多新的功能。

利用Python開關儲存檔案

今天要教大家怎麼建立、開啟、修改處存檔案,前面有說過爬蟲下來的檔案可以儲存起來,今天要針對儲存這件事情進行更詳細的說明。先說明一下為什麼要做這些事情。利用 Python ,我們可以很輕鬆的完成我們的任務,但是下次如果你還需要類似的資料的話,我們還得開啟程式讓他完成一樣的事情,不過若是你會儲存檔案的話,當你把資料整理成你適當的格式後,未來你需要這些資料只要把他們打開就好了,並且你也可以藉由讀取這些資料來完成其他的目標,也可以增加程式的效率。所以我們來看看 Python 關於檔案的存取吧。

首先我想做的事件裡一份新的記事本檔案,並把我某些資料放到裡面。

f = open(r'E:/Python.txt', 'w')
f.write("我最愛 Tiny Corner !!")
f.close()

 

 

其中利用 open 的指令的話,在上面的範例,他會優先搜尋 E 槽中,是否存在Python.txt 的檔案,若是不存在的話,他會建立一份這樣的檔案。接著在後面就是對這份檔案的處理,f.write("我最愛 Tiny Corner !!")就是將 “我最愛Tiny Corner” 存到檔案中。最後有一個最重要最重要的事情要做:要記得把檔案關掉案關掉要記得把檔要記得把檔案關掉 !! 這件事情非常重要,也很容易忘記,而且除了在Python中,包含大部分的程式語言在進行讀取的時候最後要記得關閉檔案,否走檔案可能會被不可預期的修改。接著我們來看看存起來的檔案吧!!

我們可以看到在E槽中自動生成 Python.exe,接著我們打開來看:

檔案果然也是我們所要求的。

接著我們來修改新的檔案進去吧,大家回去看一下剛剛的程式碼f = open(r'E:/Python.txt', 'w'),其中的  ” w “,指的是下面做的是” 寫入的工作 “,如果檔案尚未存在的話就會新建一個檔案; 如果檔案已經存在的話,就會進行覆蓋。我們來試試看這次的差異吧~~

f = open(r'E:/Python.txt', 'w')
f.write("如果沒按讚的要記得趕快去按讚~~")
f.close()

上面看到原本的檔案會被整個覆蓋掉喔, 那如果我們只是要加上某段文字,我們可以切換另一種模式:

f = open(r'E:/Python.txt', 'a')
f.write("Tiny Corner是最棒的免費數據分析教學網站")
f.close()

這次我們換成 “a” 的模式,變成附加在後面的模式。

那如我們只做檔案的讀取,不想針對檔案中的內容作修改,可以改成 ” r “的模式,我們來試試看如果在 ” r ” 下寫入新的資料會發生怎麼樣的事情:

可以看提示說不可以寫入(not writable),如果是想要單純取用存在自己電腦裡面的檔案的話,可以開啟這個模式,避免不小心更動到檔案中的資料。最後在特別提醒:要記得把檔案關掉,也就是f.close()這行,如果你很不幸忘記關掉的,而且你又是在始用 ” w “的模式底下,你原本的檔案 ” 有機會被覆蓋掉 “,而且會被修改成怎麼我也不知道,誰叫你不關。反正為了避免麻煩就是要記得:有開啟檔案,就要記得關掉檔案

 

 

Matplotlib ( IV ) — 畫圓餅圖

今天來教大家怎麼畫圓餅圖,其實跟摺線圖與柱狀圖一樣我們只要做點修正就可以成功地把我們要的圓餅圖給畫出來,只是每一種畫法的所需要用到的參數都不太一樣,所以現在我們就來看要怎麼畫出漂亮的圓餅圖吧~~

這次我們只取出 a 班來畫,下面可以很清楚的看到只要將 plt.後面改成 pie 就好了

import matplotlib.pyplot as plt
x = ['basketball', 'swim', 'take photos', 'reading', 'guitar']

class_a = [8, 7, 1, 6, 5]
plt.pie(class_a)

上面的可以看到圓餅圖很輕易的就被我們給畫出來了,然而看著這張圖你會發現什麼東西都看不出來,所以一樣,我們樣替每一塊顏色修改 ” labels ” 的參數,就可以把名稱加上去,另外我們可以也可以挑整圓餅的顏色,利用修改 ” colors ” 的參數,下面我們來時做看看:

pie_color = ["yellow","plum", "grey", "brown", "orange"]
plt.pie(class_a, colors = pie_color, labels = x)

顏色就被我們調整過囉~而且我們也把每個項目都加上名稱囉 !! 接下來就要幫這個圓餅圖取一個標題,不過這邊還存在一個問題,那就是很難看出每一塊每一塊的大小到底是多少,這時我們可以修改 ” autopct ” 這個參數,可以叫出每一塊的百分比,並選擇要用幾位數來表示:

pie_color = ["yellow","plum", "grey", "brown", "orange"]
plt.pie(class_a, colors = pie_color, labels = x, autopct = "%2.2f%%")
plt.title("Hobbies Investigation")

另外其中看起來很像外星文的"%2.2f%%"代表的是取兩位整數,兩位小數;如果是三位整數,一位小數的寫法就是:"%3.1f%%"。大家可以自己選擇百分比的寫法。

有一件事情,大家有沒有發現這個圓好像不是正圓,對這原本就是這樣,不是我亂拉圖的變形,這是一開始我也看了好久= =,後來發現還對 x, y 軸做設定。

好啦,這樣就是我要的圓餅圖了。不過還有一種場景,如果說在簡報的時候,我們要特別拿出其中一塊出來討論的話,在 Matplotlib 中可以特別把那一塊移出來。假設我們今天想要看” guitar ” 這一塊,我們可以利用 ” explode ” 這個參數來調整,不過要注意的是explode這個參數是要 ” 每一個 ” 區塊都做設定,跟上面的 ” colors “設定方法是一樣的:

pie_color = ["yellow","plum", "grey", "brown", "orange"]
explode_p = (0, 0, 0, 0, 0.1)
plt.pie(class_a, colors = pie_color, labels = x, autopct = "%2.2f%%", explode=explode_p)
plt.title("Hobbies Investigation")
plt.axis("equal")

其中如果要保持原位的就令成 ” 0 “,而第五項的 guitar 就把它設成 0.1 就可以得到我們我們一開始預期得到的圖案拉~~

 

 

 

 

 

 

 

Matplotlib ( III ) — 畫柱狀圖

今天我們繼續來用 Matplotlib ,今天做的是直方圖,和摺線圖相比,我們只要把 plot 改成 bar 就好,我們延續 plot 中的兩個班級課後休閒活動調查來畫畫看。這邊我們先單獨畫出a 班的圖。

import matplotlib.pyplot as plt
x = ['basketball', 'swim', 'take photos', 'reading', 'guitar']

class_a = [8, 7, 1, 6, 5]
class_b = [12, 2, 9, 5, 3]
plt.bar(x, class_a, label = 'class_a')

大家可以看到非常簡單的只要把 plot 改成 bar 就好了。接著我們試著看看把 b 班也一起加上來吧~~

plt.bar(x, class_a, label = 'class_a')
plt.bar(x, class_b, label = 'class_b')

結果發生悲劇惹,我們可以看到大家可以看到 b 班的資料把 a 班蓋掉拉 ~ 尤其是basketball 跟 swim 因為 a 班數量比較少,所以完全看不出來是多少。所以我們要想其他的處理方式。在plt.bar()中還有可以參數align可以調整,他有兩種選擇,一是” center “,另一種是” edge “,設定” center “的話,長條圖會對準中間,而 ” edge ” 則會左邊對準黑線。所以我們再來修改一下這個參數試試看吧~

plt.bar(x, class_a, label = 'class_a', align = "center")
plt.bar(x, class_b, label = 'class_b', align = "edge")

畫出來之後覺得結果還是差強人意,雖然部分分開來了,但是有一部分還是重疊的,我們必須要想辦法把它分開,大家可能會想說既然有左邊靠齊的 ” edge “,那有沒有右邊靠齊的選項呢?很不幸的,答案是沒有,不過我們可以利用另一個參數讓他右邊對齊,那個參數叫做width,但大家可能又發現一件事情,width不是指的是寬度嗎?對沒錯,width 指的是直方圖左邊對齊的地方到右邊的寬度,所以我們把 width 令成負數的話,他就會變成往左邊,就可以達到對齊右邊的目標,我們現在來試試看:

plt.bar(x, class_a, label = 'class_a', align = "edge", width = 0.35)
plt.bar(x, class_b, label = 'class_b', align = "edge", width = -0.35)

最後我們用之前學過的,增加標題與x, y軸的名稱,調整一下這張圖:

plt.bar(x, class_a, label = 'class_a', align = "edge", width = 0.35)
plt.bar(x, class_b, label = 'class_b', align = "edge", width = -0.35)
plt.legend() #要使用label要加這行

plt.title("hobbies investigation")
plt.xlabel("hobbies")
plt.ylabel("numbers")

 

Matplotlib ( II ) — X軸、Y軸 與 title 的名稱設定

延續上一篇的教學,今天要將我們做出來的圖變得更完整。首先我們要為這張圖表先加上標題,並加上 x, y 座標的名稱。首先在plt.title()我們可以替這張圖表下標題,並利用plt.xlabel()plt.ylabel()替 x 座標跟 y 座標註解。做出來就會是完整的一張完整的摺線圖囉~

import matplotlib.pyplot as plt
x = [1, 3, 5, 7, 9]
y = [20, 30, 10, 40, 20]
plt.plot(x, y)
plt.title("Test 1")
plt.xlabel("data x")
plt.ylabel("data y")

接著在這張圖上我們也可以放上不同的資料表,下面是我模擬的場景,假設要調查兩個班級不同的的興趣分布,對了,除了放數字外,表單中也可以放英文字進去,於是下面我們依序調查了五種休閒活動,並計算喜歡的人數。接著我們還可以把兩個班級放在同一張圖上。

import matplotlib.pyplot as plt
x = ['basketball', 'swim', 'take photos', 'reading', 'guitar']

class_a = [8, 7, 1, 6, 5]
class_b = [12, 2, 9, 5, 3]

plt.plot(x, class_a)
plt.plot(x, class_b)

plt.title("hobbies investigation")
plt.xlabel("hobbies")
plt.ylabel("numbers")

好啦,我們就把兩個調查好的資料放在一張圖上囉~~其實光是這個做法初步就可以了解一些資料囉~不過大家有沒有發現,在圖上我們看不出來哪一個是 class_a ,哪一個是 class_b ,所以我們還必須這個資訊標到上面去,

plt.plot(x, class_a, label = 'class_a')
plt.plot(x, class_b, label = 'class_b')
plt.legend()

其實這個標籤也是在plt.plot()中的一個參數,大家只要去把label改成自己需要的就好,不過這邊要特別注意,需要加一行plt.legend(),他們才會顯出來喔~

好啦大致上 Matplotlib 折線圖的部分就是這樣囉,依照這兩篇的教學應該可以應付大部分的需求了。不過可不要以為 Matplotlib 的功能只有這樣喔,他還有很多不同類型的圖的可以做出來~~未來我們也會為大家一一介紹~