iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 6
0
AI & Data

python 入門到分析股市系列 第 6

[Day06]儲存資料 - File、檔案類型(csv、xml、json、yaml)

導讀

前言

如果要分析金融的數據,數據一定會儲存在某個地方,可以是檔案,也可以放資料庫。今天要來介紹儲存檔案的方法,並且介紹檔案可以存成什麼類型


os

os套件是Python中常用的文件和目錄的操作,在os中常用的函式

名稱 說明
system() 執行系統command
mkdir(E) 建立E目錄,如果E目錄已存在會發生錯誤
rmdir(E) 移除E目錄
remove(E) 移除E檔案,如果E是目錄就會出錯
getcwd() 取得目前所在路徑
rename(src, dst) 將 src 改名為 dst

先示範os的函式

import os
path = "myDir"
os.mkdir(path) # 建立目錄
os.rmdir(path) # 移除目錄
os.system("mkdir dir2") #執行作業系統命令
os.rename('day06.txt', 'day06_change.txt')
print("當前目錄位置--->",os.getcwd())
# 輸出結果
當前目錄位置---> C:\Users\lasts\Desktop\git\demo\python\learn_python_data_analysis\01.Install
  • os.path有以下常用的函式
    名稱 | 說明
    ------------- | -------------
    isfile(E) | E檔案是否存在
    isdir(E) | E目錄是否存在
    join(src, dst) | 拼接目錄,只有拼接,不會建立目錄
    exists | 判斷文件或目錄是否存在
    getsize | 取得文件大小
    abspath | 獲得檔案的絕對路徑
file = "day06-01.txt"
print("完整路徑名稱--->",os.path.abspath(file))  # 完整路徑名稱
print(file," 是否存在--->",os.path.exists(file)) # 是否存在
print(file," 檔案大小--->",os.path.getsize(file)) #取得檔案大小
# 輸出結果
完整路徑名稱---> C:\Users\lasts\Desktop\git\demo\python\learn_python_data_analysis\01.Install\day06-01.txt
day06-01.txt  是否存在---> True
day06-01.txt  檔案大小---> 0
  • os.walk
    取得目錄下所有檔案和目錄
import os
for root, dirs, files in os.walk("day06-dir"):
    for name in files:
        print("檔案--->",os.path.join(root, name))
    for name in dirs:
        print("目錄--->",os.path.join(root, name))
    print()
# 輸出結果
目錄---> day06-dir\first
目錄---> day06-dir\second
目錄---> day06-dir\third

檔案---> day06-dir\first\first-01.txt
檔案---> day06-dir\first\first-02.txt
檔案---> day06-dir\first\first-03.txt

檔案---> day06-dir\second\second-01.txt

open()

檔案的輸出和輸入
語法:open(filename, mode)
mode傳入的是字串,第一個字母代表操作,第二個字母代表類型
操作的部分

文字 說明
r 讀取
w 寫入。檔案不存在則新增,檔案存在則寫入存在檔案
X 寫入。只有當檔案不存在時才可寫入
a 在檔案結尾處寫入

類型

文字 說明
t 文字
b 二進位

以下示範寫入文字

content = '''Python first   
測試中文
第三行
'''  # '''...'''  保留原本的格式
f = open('firstFile.txt','wt') # 寫入模式,檔案如果已經存在會被覆蓋
f.write(content)
f.close()

讀取文字

f2 = open('firstFile.txt','r') # 讀取模式
for line in f2:
    print(line, end="")
f2.close()
# 輸出結果
Python first   
測試中文
第三行

文字檔結構

  • CSV:純文字的方式儲存檔案資料,已逗號分隔資料,可用Microsoft Excel打開檔案。
    格式如下
股票,收盤價,單量
台積電,238,23
大同,40,121
華新科,174,105
    * 以下示範寫入CSV / 讀取CSV
import csv
with open('day06-csv.csv', 'w', newline='') as csvfile:
    writer = csv.writer(csvfile) # 建立 CSV 檔寫入器
    writer.writerow(['股票', '收盤價', '單量'])
    writer.writerow(['台積電', 238, 23])
    writer.writerow(['大同', 40, 121])
    writer.writerow(['華新科', 174, 105])
    
# ---------------------------------------------------------- read

with open('day06-csv.csv', newline='') as csvfile:

  rows = csv.reader(csvfile)  # 讀取 CSV 檔案內容
  for row in rows:  # 以迴圈輸出每一列
    print(row)
# 輸出結果
['股票', '收盤價', '單量']
['台積電', '238', '23']
['大同', '40', '121']
['華新科', '174', '105']
  • XML:可延伸標記式語言,是一種標記式語言。
    格式如下
<stock>
  <tsmc>
   <close name="收盤價">238</close>
   <buy name="單量">23</buy>
  </tsmc>
</stock>
  * 以下示範寫入XML / 讀取XML
import xml.etree.ElementTree as ET
data = ET.Element('stock') #建立節點stock
tsmc = ET.SubElement(data, 'tsmc')  # 在stock節點底下建立子節點
close = ET.SubElement(tsmc, 'close')  
buy = ET.SubElement(tsmc, 'buy')  
close.set('name','收盤價') # 設定節點的名稱
buy.set('name','單量')  
close.text = '238'  
buy.text = '23'

mydata = ET.tostring(data)  
myfile = open("day06-xml.xml", "wb")  
myfile.write(mydata)  
myfile.close()
    
# ---------------------------------------------------------- read

tree = ET.parse('day06-xml.xml')  
root = tree.getroot()

for elem in root:  
    for subelem in elem:
        print(subelem.get('name'),"----->",subelem.attrib)
# 輸出結果
收盤價 -----> {'name': '收盤價'}
單量 -----> {'name': '單量'}
  • JSON:輕量級的資料交換語言
    格式如下
{
  "stock": [
    {
      "name": "台積電",
      "close": "238",
      "buy": "23"
    },
    {
      "name": "大同",
      "close": "40",
      "buy": "121"
    },
    {
      "name": "華新科",
      "close": "174",
      "buy": "105"
    }
  ]
}
     * 以下示範寫入JSON / 讀取JSON
import json

data = {}  
data['stock'] = []  
data['stock'].append({  
    'name': '台積電',
    'close': '238',
    'buy': '23'
})
data['stock'].append({  
    'name': '大同',
    'close': '40',
    'buy': '121'
})
data['stock'].append({  
    'name': '華新科',
    'close': '174',
    'buy': '105'
})

with open('day06-json.json', 'w') as outfile:  
    json.dump(data, outfile,ensure_ascii=False,indent=2)
    
# ---------------------------------------------------------- read

with open('day06-json.json') as json_file:  
    data = json.load(json_file)
    for p in data['stock']:
        print('股票: ' + p['name'])
        print('收盤價: ' + p['close'])
        print('單量: ' + p['buy'])
        print('')
# 輸出結果
股票: 台積電
收盤價: 238
單量: 23

股票: 大同
收盤價: 40
單量: 121

股票: 華新科
收盤價: 174
單量: 105
  • YAML:是一個可讀性高,用來表達資料序列的格式
    格式如下
stock:
  buy: '121'
  close: '238'
  name: '台積電'
     * 以下示範寫入YAML / 讀取YAML
import yaml
cfg = {
  "stock": dict(
      name='台積電',
      close='238',
      buy='121'
   )  
}
with open("day06_yml.yml", 'w') as outfile:
    yaml.dump(cfg, outfile, default_flow_style=False,allow_unicode=True) 
    
# ---------------------------------------------------------- read

with open("day06_yml.yml", 'r') as yml:
    contents = yaml.safe_load(yml)
    print("取得股票--->",contents['stock'])
# 輸出結果
取得股票---> {'buy': '121', 'close': '238', 'name': '台積電'}

參考文件

XML
JSON
YAML


上一篇
[Day05]Python 基礎語法 - function、import
下一篇
[Day07]Learning Numpy - 建立、合併、分割
系列文
python 入門到分析股市30

1 則留言

0
Andy Chiu
iT邦研究生 3 級 ‧ 2018-11-08 11:07:55

筆誤:

import xml.etree.ElementTree as ET
\data = ET.Element('stock') #建立節點stock

多了斜線

Summer iT邦新手 5 級‧ 2018-11-08 11:21:37 檢舉

大大真的很細心,也謝謝你的觀看,有人看真的很感動,已經修正了/images/emoticon/emoticon41.gif

Andy Chiu iT邦研究生 3 級‧ 2018-11-08 13:12:11 檢舉

因為邊看邊做,就順便幫忙校正了,這個題目我還蠻有興趣的,感謝分享啊!

Summer iT邦新手 5 級‧ 2018-11-08 13:25:20 檢舉

我其實也只是個初學者,對於股票和Python都是XDD,非常感謝你的回覆還有糾正。/images/emoticon/emoticon34.gif

我要留言

立即登入留言