載入常見檔案格式

The world’s most valuable resource is no longer oil, but data.

The Economist

獲取資料在資料科學專案中扮演發起點,如果這個資料科學專案目的是協助我們制定資料驅動的策略(data-driven strategy),而非倚賴直覺,那麼為專案細心盤點資料來源與整理獲取方法,可以為將來的決策奠基穩固的基礎。資料常見的來源包含三種:

  1. 檔案
  2. 資料庫
  3. 網頁資料擷取

這個小節我們關注常見的四種檔案格式:CSV、TXT、Excel 試算表與 JSON。

文字編輯器

在四種常見檔案格式中,除了 Excel 試算表,CSV、TXT 與 JSON 其實就是副檔名分別為 .csv、.txt 與 .json 的純文字檔案,在個人電腦中可以使用任意文字編輯器開啟以便檢視,通常系統內建的文字編輯器(例如筆記本)由於功能陽春不太推薦使用,較常被推薦適合一般使用者的文字編輯器有:

通常我們會使用文字編輯器開啟檢視預計要載入的純文字檔案,觀察是否具有變數名稱(header)或是分隔符號(separator)等注意事項。

檔案:CSV

副檔名為 .csv 純文字檔案指的是逗號分隔資料(comma separated values),如果我們將 1995 至 1996 年的芝加哥公牛隊球員名單與一些基本資訊以 CSV 檔案儲存,外觀長得像這樣:

以文字編輯器檢視 CSV 檔案

因為 CSV 檔案是常見的檔案格式,因此像是 Excel 試算表、GitHub Gist 等服務都會直接將逗號識別出來,並根據逗號分隔不同變數;如果直接以 Excel 試算表開啟 CSV 檔案,是看不見逗號的。

以 Excel 試算表檢視 CSV 檔案

如何載入 CSV 檔案

Python

在 Python 中我們使用 pandas 的 read_csv()

# pd.read_csv() 使用預設參數
import pandas as pd

csv_url = "https://storage.googleapis.com/ds_data_import/chicago_bulls_1995_1996.csv"
csv_df = pd.read_csv(csv_url)
csv_df
1
2
3
4
5
6

pd.read_csv() 使用預設參數

pd.read_csv() 方法中值得注意的參數有:

  • sep 參數:預設為 , 因為 CSV 檔案就是以逗號(comma)分隔的檔案格式
  • header 參數:預設會將 CSV 檔案最上方的一列作為變數名稱,如果 CSV 檔案中沒有變數名稱,需指派 header=None
  • names 參數:假如已經指派 header=None 則 names 參數就需要輸入一組變數名稱的 list
  • skiprows 參數:指定在讀取時要略過多少列檔案上方的觀測值
  • skipfooter 參數:指定在讀取時要略過多少列檔案下方的觀測值
  • nrows 參數:指定要讀入幾列觀測值
  • na_values 參數:除了內建的遺漏值種類,還有哪些額外的字元要被視為遺漏值

如果我們在 pd.read_csv() 中指定了 skiprows=1header=Nonenames=[‘number’, ‘player’, ‘pos’, ‘ht’, ‘wt’, ‘birth_date’, ‘college’] 表示略過本來 CSV 中作為變數名稱的一列、資料中沒有變數名稱並且自行為資料的七個變數命名。

# pd.read_csv() 自行指定變數的名稱
import pandas as pd

csv_url = "https://storage.googleapis.com/ds_data_import/chicago_bulls_1995_1996.csv"
csv_df = pd.read_csv(csv_url, header=None, skiprows=1, names=['number', 'player', 'pos', 'ht', 'wt', 'birth_date', 'college'])
csv_df
1
2
3
4
5
6

pd.read_csv() 自行指定變數的名稱

R 語言

在 R 語言中我們使用內建函數 read.csv()

# read.csv() 使用預設參數
csv_url <- "https://storage.googleapis.com/ds_data_import/chicago_bulls_1995_1996.csv"
csv_df <- read.csv(csv_url)
View(csv_df)
1
2
3
4

read.csv() 使用預設參數

read.csv() 函數中值得注意的參數有:

  • header 參數:預設會將 CSV 檔案最上方的一列作為變數名稱,如果 CSV 檔案中沒有變數名稱,需指派 header = FALSE
  • sep 參數:預設為 , 因為 CSV 檔案就是以逗號(comma)分隔的檔案格式
  • col.names 參數:假如已經指派 header = FALSE 則 col.names 參數就需要輸入一組變數名稱的向量
  • na.strings 參數:指定有哪些字元要被視為遺漏值

如果我們在 read.csv() 中指定了 skip = 1header = FALSEcol.names = c('number', 'player', 'pos', 'ht', 'wt', 'birth_date', 'college') 表示略過本來 CSV 中作為變數名稱的一列、資料中沒有變數名稱並且自行為資料的七個變數命名。

# read.csv() 自行指定變數的名稱
csv_url <- "https://storage.googleapis.com/ds_data_import/chicago_bulls_1995_1996.csv"
csv_df <- read.csv(csv_url, skip = 1, header = FALSE, col.names = c('number', 'player', 'pos', 'ht', 'wt', 'birth_date', 'college'))
View(csv_df)
1
2
3
4

read.csv() 自行指定變數的名稱

檔案:TXT

副檔名為 .txt 純文字檔案跟 CSV 檔案的差異就在於分隔符號(separator),如果我們將 1995 至 1996 年的芝加哥公牛隊球員名單與一些基本資訊以 TXT 檔案儲存,並以分號區隔變數,外觀長得像這樣:

以文字編輯器檢視 TXT 檔案

因為 TXT 檔案的分隔符號有太多種類(常見有分號、冒號、Tab 或空格等),在沒有指定妥當分隔符號的情況下,像是 Excel 試算表都只會直接將原始樣貌呈現出來。

未指定分隔符號以 Excel 試算表檢視 TXT 檔案

Excel 試算表必須在指定好分隔符號之後,才會依照該符號將資料呈現為表格形式。

指定分隔符號後以 Excel 試算表檢視 TXT 檔案

如何載入 TXT 檔案

Python

在 Python 中我們使用 pandas 的 pd.read_table() 方法;值得注意的參數是 sep 預設為 \t 意即 tab 鍵,因此面對以分號做為變數分隔的 TXT 檔案就要指定為 sep=";"

# pd.read_table() 指定 sep=";"
import pandas as pd

txt_url = "https://storage.googleapis.com/ds_data_import/chicago_bulls_1995_1996.txt"
txt_df = pd.read_table(txt_url, sep=";")
txt_df
1
2
3
4
5
6

pd.read_table() 指定 sep=

R 語言

在 R 語言中我們使用內建函數 read.table();值得注意的參數是 sep 預設為 \s 意即空白,因此面對以分號做為變數分隔的 TXT 檔案就要指定為 sep = ";",而 header 參數在這此預設為 FALSE,這跟 read.csv() 函數的預設也不同。

# read.table() 指定 sep = ";"
txt_url <- "https://storage.googleapis.com/ds_data_import/chicago_bulls_1995_1996.txt"
txt_df <- read.table(txt_url, sep = ";", header = TRUE)
View(txt_df)
1
2
3
4

read.table() 指定 sep =

檔案:試算表

副檔名為 .xlsx 或者 .xls 的試算表檔案是絕大多數使用者非常熟悉的資料儲存格式,除了使用 Microsoft 的 Excel 可以開啟檢視,另外也有 Google 雲端硬碟的 Google 試算表、LibreOffice 的 Calc 或者 MacOS 的 Numbers 能夠開啟檢視副檔名為 .xlsx 或者 .xls 的檔案。如果我們將 1995 至 1996 年的芝加哥公牛隊球員名單、2007 至 2008 年的波士頓賽爾提克隊球員名單與一些基本資訊儲存在一個 Excel 試算表檔案中,外觀長得像這樣:

以試算表軟體檢視 .xlsx 檔案的第一個工作表

以試算表軟體檢視 .xlsx 檔案的第二個工作表

如何載入 Excel 試算表檔案

Python

在 Python 中我們使用 pandas 的 pd.read_excel() 方法。

# pd.read_excel() 使用預設參數
import pandas as pd

xlsx_url = "https://storage.googleapis.com/ds_data_import/fav_nba_teams.xlsx"
chicsgo_bulls = pd.read_excel(xlsx_url)
chicsgo_bulls
1
2
3
4
5
6

pd.read_excel() 使用預設參數

值得注意的參數有:

  • sheet_name 參數:預設為 0,也就是排序最前面的工作表,可以利用整數來指定載入的工作表,也可以使用工作表名稱來指定
  • header 參數:預設為 0,也就是以最上方的一列作為變數名稱,指定 header=None 假如資料中沒有包含變數名稱
  • names 參數:假如已經指派 header=Nonenames 參數就需要輸入一組變數名稱的 list
  • usecols 參數:選擇哪幾個變數要載入
  • skiprows 參數:指定在讀取時要掠過多少列檔案上方的觀測值
  • skipfooter 參數:指定在讀取時要略過多少列檔案下方的觀測值

例如指定讀取第二個工作表、並選取部分儲存格範圍 A7 至 C16。

# pd.read_excel() 指定工作表與讀取範圍
import pandas as pd

xlsx_url = "https://storage.googleapis.com/ds_data_import/fav_nba_teams.xlsx"
boston_celtics = pd.read_excel(xlsx_url, sheet_name='boston_celtics_2007_2008', skiprows=6, header=None, names=['number', 'player', 'pos'], usecols=[0, 1, 2])
boston_celtics
1
2
3
4
5
6

pd.read_excel() 指定工作表與讀取範圍

R 語言

在 R 語言中我們使用 readxl 套件的 read_excel() 函數。

# readxl::read_excel() 函數使用預設參數
library(readxl)

xlsx_url <- "https://storage.googleapis.com/ds_data_import/fav_nba_teams.xlsx"
dest_file <- "~/Desktop/fav_nab_teams.xlsx" # 更改為自己的檔案路徑
download.file(xlsx_url, destfile = dest_file)
chicago_bulls <- read_excel(dest_file)
View(chicago_bulls)
1
2
3
4
5
6
7
8

readxl::read_excel() 函數使用預設參數

值得注意的參數有:

  • sheet 參數:預設為讀取排序最前面的工作表,可以利用整數來指定載入的工作表,也可以使用工作表名稱來指定
  • range 參數:指定要讀取儲存格的範圍,輸入範例像是 "B3:D87"
  • col_names 參數:預設為 TRUE,以最上方的一列作為變數名稱,或者自行輸入一組文字向量自訂變數名稱

例如指定讀取第二個工作表、並選取部分儲存格範圍 A7 至 C16。

# readxl::read_excel() 函數指定工作表與讀取範圍
library(readxl)

xlsx_url <- "https://storage.googleapis.com/ds_data_import/fav_nba_teams.xlsx"
dest_file <- "~/Desktop/fav_nab_teams.xlsx" # 更改為自己的檔案路徑
download.file(xlsx_url, destfile = dest_file)
boston_celtics <- read_excel(dest_file, sheet = "boston_celtics_2007_2008", range = "A7:C16", col_names = c("number", "player", "pos"))
View(boston_celtics)
1
2
3
4
5
6
7
8

readxl::read_excel() 函數指定工作表與讀取範圍

很多的 Excel 試算表都會有多餘的資料,像是使用者的註記或者說明文字,導致表格資料不一定是從最上方那一列開始讀取,也不一定要讀取所有的欄位;在使用 Python 的 pd.read_excel() 方法時,skiprowsskipfooterusecols 這三個參數顯得格外重要;在使用 R 語言的 read_excel() 函數時,則要特別留意 range 參數。

檔案:JSON

JSON 是 JavaScript Object Notation 的縮寫,這是一種彈性很大且常見於網站資料傳輸的檔案格式,它的特性是可以容納不同長度、型別並且巢狀式地(nested)包容資料,如果我們將 1995 至 1996 年的芝加哥公牛隊的一些基本資訊以 JSON 檔案儲存,外觀長得像這樣:

以文字編輯器檢視副檔名為 .json 的檔案

這個 JSON 檔案中共有五組鍵(Key)與值(Value)的配對:

  • team_name(鍵)對應字串 "Chicago Bulls"(值)
  • records(鍵)對應一個巢狀 JSON(nested JSON)(值)
  • coach(鍵)對應字串 "Phil Jackson"(值)
  • assistant_coach(鍵)對應一個陣列 ["Jim Cleamons", "John Paxson", "Jimmy Rodgers", "Tex Winter"](值)
  • starting_lineups(鍵)對應一個巢狀 JSON(nested JSON)(值)

在刻意設定之下,我們所面對的 JSON 檔案展現彈性很大的包容性,不僅可以儲存字串、陣列甚至還可以儲存 JSON。由於 JSON 檔案具備了鍵(Key)與值(Value)配對的特性,在 Python 中通常以 dict 的型別承接,在 R 語言中通常以 list 的型別承接。

如何載入 JSON 檔案

Python

JSON 檔案若是儲存在雲端,利用 requests 模組的 get() 函數搭配 .json() 方法就可以載入,成功之後會以 dict 型別供後續操作。

# JSON 檔案儲存在雲端
from requests import get

json_url = 'https://storage.googleapis.com/ds_data_import/chicago_bulls_1995_1996.json'
chicago_bulls_dict = get(json_url).json()
print(type(chicago_bulls_dict))
chicago_bulls_dict
1
2
3
4
5
6
7
## <class 'dict'>
## {'assistant_coach': ['Jim Cleamons',
##   'John Paxson',
##   'Jimmy Rodgers',
##   'Tex Winter'],
##  'coach': 'Phil Jackson',
##  'records': {'losses': 10, 'wins': 72},
##  'starting_lineups': {'C': 'Luc Longley',
##   'PF': 'Dennis Rodman',
##   'PG': 'Ron Harper',
##   'SF': 'Scottie Pippen',
##   'SG': 'Michael Jordan'},
##  'team_name': 'Chicago Bulls'}
1
2
3
4
5
6
7
8
9
10
11
12
13

JSON 檔案若是儲存在本機,我們使用 json 模組的 load() 函數將 JSON 檔案載入,成功之後同樣會以 dict 型別供後續操作。

# JSON 檔案儲存在本機
from json import load

json_fp = "chicago_bulls_1995_1996.json"
with open(json_fp) as f:
    chicago_bulls_dict = load(f)
print(type(chicago_bulls_dict))
chicago_bulls_dict
1
2
3
4
5
6
7
8
## <class 'dict'>
## {'assistant_coach': ['Jim Cleamons',
##   'John Paxson',
##   'Jimmy Rodgers',
##   'Tex Winter'],
##  'coach': 'Phil Jackson',
##  'records': {'losses': 10, 'wins': 72},
##  'starting_lineups': {'C': 'Luc Longley',
##   'PF': 'Dennis Rodman',
##   'PG': 'Ron Harper',
##   'SF': 'Scottie Pippen',
##   'SG': 'Michael Jordan'},
##  'team_name': 'Chicago Bulls'}
1
2
3
4
5
6
7
8
9
10
11
12
13

後續操作像是計算勝率或者從先發陣容中選出最喜歡的球員,只要透過處理巢狀 dict 的操作就可以順利完成。

# JSON 檔案儲存在雲端
from requests import get

json_url = 'https://storage.googleapis.com/ds_data_import/chicago_bulls_1995_1996.json'
chicago_bulls_dict = get(json_url).json()
# 計算勝率或者從先發陣容中選出最喜歡的球員
winning_percentage = chicago_bulls_dict["records"]["wins"] / (chicago_bulls_dict["records"]["wins"] + chicago_bulls_dict["records"]["losses"])
fav_player = chicago_bulls_dict["starting_lineups"]["SG"]
print("勝率為 {:.2f}".format(winning_percentage))
print("最喜歡的球員是 {}".format(fav_player))
1
2
3
4
5
6
7
8
9
10
## 勝率為 0.88
## 最喜歡的球員是 Michael Jordan
1
2

R 語言

我們使用 jsonlite 套件的 fromJSON() 函數將 JSON 檔案載入,成功之後會以 list 型別供後續操作。

# jsonlite::fromJSON() 函數載入 JSON 檔案
library(jsonlite)

json_url <- "https://storage.googleapis.com/ds_data_import/chicago_bulls_1995_1996.json"
chicago_bulls_list <- fromJSON(json_url)
chicago_bulls_list
1
2
3
4
5
6
## $team_name
## [1] "Chicago Bulls"

## $records
## $records$wins
## [1] 72

## $records$losses
## [1] 10


## $coach
## [1] "Phil Jackson"

## $assistant_coach
## [1] "Jim Cleamons"  "John Paxson"   "Jimmy Rodgers" "Tex Winter"   

## $starting_lineups
## $starting_lineups$PG
## [1] "Ron Harper"

## $starting_lineups$SG
## [1] "Michael Jordan"

## $starting_lineups$SF
## [1] "Scottie Pippen"

## $starting_lineups$PF
## [1] "Dennis Rodman"

## $starting_lineups$C
## [1] "Luc Longley"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

後續操作像是計算勝率或者從先發陣容中選出最喜歡的球員,只要透過處理巢狀 list 的操作就可以順利完成。

# jsonlite::fromJSON() 函數載入 JSON 檔案
library(jsonlite)

json_url <- "https://storage.googleapis.com/ds_data_import/chicago_bulls_1995_1996.json"
chicago_bulls_list <- fromJSON(json_url)
# 計算勝率或者從先發陣容中選出最喜歡的球員
winning_rate <- chicago_bulls_list$records$wins / (chicago_bulls_list$records$wins + chicago_bulls_list$records$losses)
fav_player <- chicago_bulls_list$starting_lineups$SG
sprintf("勝率為 %.2f", winning_rate)
sprintf("最喜歡的球員是 %s", fav_player)
1
2
3
4
5
6
7
8
9
10
## [1] "勝率為 0.88"
## [1] "最喜歡的球員是 Michael Jordan"
1
2

小結

在這個小節中我們簡介如何將四種常見的檔案格式:CSV、TXT、Excel 試算表與 JSON 載入 Python 與 R 語言,Python 我們會應用 pandas、requests 與 json 等模組,R 語言我們則應用內建函數、readxl 與 jsonlite 等套件。

延伸閱讀