iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 26
0


昨天颱風天在家耍廢一天了,今天來一點簡單的
讀檔案應該是寫程式中最令人崩潰的問題~前幾天有人問我讀檔案時,還不免俗的腦袋當機呢!
檔案類型多變,所以在讀檔案時總會有不少問題。
今天我們在這裡介紹幾個讀檔案的方法
之後再一起來完成一個題目

今天我們設定處理這筆測試資料data,但在這之前我們先來練習這個小筆資料data1

以下幾個常見會在開檔案中用的指令如下:

  • open(filename,mode):開啟檔案,其中filename就是檔案存在位置,mode是要對這個檔案做些事情
    r - 唯讀模式(檔案需存在),只能從指定檔案讀取資料,並不能夠對這個檔案的內容進行任何寫入或變更
    w - 寫入模式(進行覆寫),如果檔案存在,會直接覆蓋掉原本的檔案,進行覆寫。如果指定的檔案路徑/名稱不存在,則會新增一個新的檔案進行寫入(檔案可不存在,若存在則清空)
    a - 寫入模式(進行續寫),在此模式下開啟檔案要進行寫入時,會從原本的檔案最後繼續進行寫入,即把續寫資料直接附加到舊檔案後面
  • .readline():讀取檔案中的整行資料,每次只讀取一行,讀完後會於每行末加上'\n'換行字元
  • .readlines():讀取檔案中的整行資料,直到讀完所有資料,也會於每行末加上'\n'換行字元,最後會將資料存在一個list中
  • read(size):參數size是選填,若設置size大小,電腦就會只為讀到指定的字節數量,一般預設是將整個檔案內容讀進來,會於每行末加上'\n'換行字元
  • .close:將檔案關閉,停止對於檔案進行任何操作。(關檔案是好習慣)

讓我們試試看

  1. 將所有檔案讀入:觀察下面兩種讀檔案的結果,可以確認兩種結果是不一樣
#read1.py
f=open('data1.txt','r')
k=f.read()
print(type(k))
print(k)
f.close
#read2.py
f=open('data1.txt','r')
k=f.readlines()
print(type(k))
print(k)
f.close
>>>python read1.py
<class 'str'>
a,1
c,2
b,5
...
>>>python read2.py
<class 'list'>
['a,1\n', 'c,2\n', 'b,5\n', 'e,5\n', 'a,3\n', 'd,0.2\n', 'e,2\n', 'c,1.5\n', 'f,5.6\n', 'k,7']
  1. 使用read指定size=5的時候
#read3.py
f=open('data1.txt','r')
print(f.read(5))
f.close
>>>python read1.py
a,1
c
  1. readline()一次只能讀一行,讀過後不重複,會一直繼續往下讀直到結束(以下我們示範五行)
#read4.py
f=open('data1.txt','r')
print(f.readline())
for i in range(4):
    print(f.readline())
f.close
>>>python read4.py
a,1

c,2

b,5

e,5

a,3

這裡可以發現到因為行末會自動加上'\n',會導致輸出到螢幕時會自動換行,以至於會有空白行的出現。

還有其他方法嗎?

從剛剛使用f.readlines()的結果可知,會將檔案當中每行當成一個字串並存到list後再回傳。而f.read()則是直接輸出為字串。但你知道使用for loop也可以完成一樣的概念:

#read4.py
f=open('data1.txt','r')
for line in f: 
#for line in f.readlines()也可以
    print(line,end='')
f.close
>>>python read.py
<class 'str'>
a,1
c,2
b,5
...

練習

這裡有多筆測試資料data,其組成就是上面範例,會有一個字母編號,代表其中一個人,隨後的數字就是他某一次得分(資料為chart,number),需要將其分數進行統計後,並且分數由高到低排列。

input:
a,1
c,2
b,5
e,7
a,3
output:
e,7
b,5
a,4
c,2

大家動手做做看吧!


上一篇
[Day29] 實例演練:質數表
下一篇
[Day31] dict也可以排序嗎?
系列文
從0開始學習程式-Python32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言