# 使用 numpy.genfromtxt 讀取混合格式的資料
> 作者:王一哲
> 日期:2019/11/8
<br />
之前我測試過使用 numpy.loadtxt 匯入 csv 檔的資料,但是資料的格式都是浮點數 (float),如果資料中某些欄位的資料格式是字串 (string),處理起來相當麻煩,改用 numpy.genfromtxt 會比較簡單。我匯入的資料檔如下:
```python
行星名稱, a (AU), T (yr)
水星, 0.387, 0.241
金星, 0.723, 0.615
地球, 1.000, 1.000
火星, 1.524, 1.881
木星, 5.203, 11.863
土星, 9.555, 29.458
天王星, 19.218, 84.022
海王星, 30.110, 164.774
```
<br />
我用以下程式碼匯入資料並繪製 XY 散布圖。
```python=
import numpy as np
import matplotlib.pyplot as plt
# 從 csv 檔讀取資料, 資料以 ',' 分隔, 略過第1列
data = np.genfromtxt("PlanetsData.csv", delimiter=',', dtype=None,
names=('Planet', 'a', 'T'), skip_header=1, encoding='UTF-8')
planet, a, T = data['Planet'], data['a'], data['T']
# a - T 關係圖
plt.figure(figsize=(6, 4.5), dpi=100)
plt.title(r'$a - T ~\mathrm{Plot}$', fontsize=16)
plt.xlabel(r'$T ~\mathrm{(yr)}$', fontsize=14)
plt.ylabel(r'$a ~\mathrm{(AU)}$', fontsize=14)
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
plt.subplots_adjust(left=0.12, bottom=0.15)
plt.grid(color='grey', linestyle='--', linewidth=1)
plt.plot(T, a, color='blue', marker='o', markersize=10, markeredgecolor='black', linestyle='')
plt.show()
```
<br />
重點在於第5、6行,以下依序說明每個選項的用途:
1. **"PlanetsData.csv"**:從 PlanetsData.csv 這個檔案匯入資料
2. **delimiter=','**:資料以逗號分隔
3. **dtype=None**:不指定資料格式
4. **names=('Planet', 'a', 'T')**:將三個欄位的資料分別命名為 Planets、a、T
5. **skip_header=1**:忽略第一列的資料
6. **encoding='UTF-8'**:文字編碼為 UTF-8 格式
將讀取到的資料指定給變數 data,如果用 print(data) 印出資料,輸出結果如下:
```python
[('水星', 0.387, 0.241) ('金星', 0.723, 0.615) ('地球', 1. , 1. )
('火星', 1.524, 1.881) ('木星', 5.203, 11.863) ('土星', 9.555, 29.458)
('天王星', 19.218, 84.022) ('海王星', 30.11 , 164.774)]
```
<br />
在第7行將三個欄位的資料分別指定給變數 planet、a、T,如果用 print 印出資料,輸出結果如下:
```python
['水星' '金星' '地球' '火星' '木星' '土星' '天王星' '海王星']
[ 0.387 0.723 1. 1.524 5.203 9.555 19.218 30.11 ]
[ 0.241 0.615 1. 1.881 11.863 29.458 84.022 164.774]
```
<br />
資料被儲存在三個一維陣列中,如果想要進一步處理數據或是用來繪圖會比較方便,以下是第10 - 19行繪圖的成果。
<img height="60%" width="60%" src="https://imgur.com/EAKafpy.png" style="display: block; margin-left: auto; margin-right: auto;"/>
<br />
**參考資料**:https://numpy.org/devdocs/user/basics.io.genfromtxt.html
---
###### tags:`Python`