2024年8月19日 星期一

Python 學習筆記 : 用 pd.read_csv() 讀取 StringIO 物件中的 csv 內容

Pandas 的 read_csv() 函式是用來讀取本地的 csv 檔案後傳回一個 DataFrame 物件, 亦即傳入的第一參數為本機的 csv 檔檔名, 如果要分析的 csv 檔位於網路上, 通常要先用爬蟲程式將該 csv 檔下載至本機後再呼叫 pd.read_csv() 來轉成 DataFrame. 

今天在 "Python 投資停看聽" 這本書的 3.4.2 節看到不需要先將爬蟲取得的 csv 存檔, 直接將爬到的 csv 內容丟給 io.StringIO() 轉成 StringIO 物件, 然後傳給 pd.read_csv() 轉成 DataFrame, 這樣就節省了檔案讀寫操作的時間, 我以前沒見過這種用法, 所以就實測了一番記之如下. 

首先匯入要用到的類別與套件模組 :

>>> from io import StringIO  
>>> import pandas as pd 
>>> import requests   

要下載的對象為政府資料開放平台上登錄編號為 11549 的證交所每日盤後資訊 : 





按 "資料資源下載網址" 欄中的 "CSV" 按鈕就會從證交所的下列網址下載最近一個交易日盤後資訊的成交資料 : 


可以用 requests 以 GET 方法下載此 CSV 檔 : 

>>> url='https://www.twse.com.tw/exchangeReport/STOCK_DAY_ALL?response=open_data'   
>>> res=requests.get(url)   

一般作法會將擷取下來的 csv 檔內容 res.text 先用 open() 儲存到本機 :

>>> with open('twse_daily_trade.csv', 'w', newline='', encoding='utf-8') as f:   
    f.write(res.text)   
                     
103316

注意, 這裡傳入 newline='' 是要避免 \n\r 導致的空一列問題, 參考 :


然後再用 pd.read_csv() 讀取此 csv 檔轉成 DataFrame :

>>> df=pd.read_csv('twse_daily_trade.csv')   
>>> df.iloc[0]    
證券代號            0050
證券名稱          元大台灣50
成交股數      13980972.0
成交金額    2561360342.0
開盤價            183.0
最高價           183.65
最低價           182.35
收盤價            183.4
漲跌價差            4.05
成交筆數         17837.0
Name: 0, dtype: object

但若沒有保留 csv 檔的必要的話, 就不需要用 open() 去存檔, 可以用 io.StringIO 類別將 res.text 轉成 StringIO 物件後直接傳給 pd.read_csv(), 它可以讀取 StringIO 物件 : 

>>> string_io=StringIO(res.text)   
>>> type(string_io)   
<class '_io.StringIO'>    
>>> df=pd.read_csv(string_io)   
>>> df.iloc[0]   
證券代號            0050
證券名稱          元大台灣50
成交股數      13980972.0
成交金額    2561360342.0
開盤價            183.0
最高價           183.65
最低價           182.35
收盤價            183.4
漲跌價差            4.05
成交筆數         17837.0
Name: 0, dtype: object

下面是在 Colab 上執行的結果 :



沒有留言 :