python pandas 讀取檔案——讀取具有明顯分隔符的資料
阿新 • • 發佈:2018-12-18
關於這篇博文提到的所有函式都可以在 IO Tools (Text, CSV, HDF5, …) 找到。
首先我們來列舉一下 pandas 處理檔案的函式1:
- pd.read_csv(filepath):從 CSV 檔案匯入資料
- pd.read_table(filepath):從限定分隔符的文字檔案匯入資料
- pd.read_excel(filepath):從 Excel 檔案匯入資料
- pd.read_sql(query, connection_object):從 SQL 表 / 庫匯入資料
- pd.read_json(json_string):從 JSON 格式的字串匯入資料
- pd.read_html(url):解析 URL、字串或者 HTML 檔案,抽取其中的 tables 表格
- pd.read_clipboard():從你的貼上板獲取內容,並傳給 read_table()
- pd.DataFrame(dict):從字典物件匯入資料,Key 是列名,Value 是資料
想要讀取具有明顯分隔符的資料,我們可以採用的函式是:
與此問有關的相關引數有三個:sep, delimiter, delim_whitespace,具體含義以 pandas.read_table
sep
: str, defaults to ‘,’ for read_csv(), \t for read_table()
分隔符使用。如果sep為None,將嘗試自動確定這一點。長度大於1個字元且與’\s+‘不同的分隔符將被解釋為正則表示式,將強制使用Python解析引擎,並忽略資料中的引號。正則表示式示例:’\r\t’。
delimiter
: str,預設None
sep的備用引數名稱。
delim_whitespace
: boolean,default False指定是否使用空格(例如’ ‘或’\t’)作為分隔符。相當於設定sep=’\s+’。如果此選項設定為True,則不應為delimiter引數傳入任何內容。
版本0.18.1中的新功能:支援Python解析器。
我們想要讀取什麼分隔符特徵的資料主要就靠指定上述三個引數。其中 delim_whitespace
只在以空格為分隔符的資料中有用。
下面我們就來簡單介紹利用這兩個函式怎麼讀取一些具有常見分隔符的資料。
文章目錄
讀取以空格為分割符的資料
如圖,上面有一個以空格為分隔符的檔案
pd.read_csv
>>> dataframe = pd.read_csv(r"C:\Users\Administrator\Desktop\data.txt", header=None, sep=' ')
>>> dataframe
0 1 2 3 4 5 6 7
0 46.19 99.74 29.00 86.38 52.35 29.89 99.07 83.01
1 24.16 99.99 27.88 43.85 40.05 28.84 99.89 82.92
... 為了減少所佔空間,省略了一些
13 97.58 99.43 28.53 81.55 80.44 27.40 84.57 82.59
14 95.23 97.37 28.19 63.28 86.51 26.90 73.27 82.08
pd.read_table
>>> dataframe = pd.read_table(r"C:\Users\Administrator\Desktop\data.txt", header=None, delim_whitespace=True)
>>> dataframe
0 1 2 3 4 5 6 7
0 46.19 99.74 29.00 86.38 52.35 29.89 99.07 83.01
1 24.16 99.99 27.88 43.85 40.05 28.84 99.89 82.92
...
13 97.58 99.43 28.53 81.55 80.44 27.40 84.57 82.59
14 95.23 97.37 28.19 63.28 86.51 26.90 73.27 82.08
讀取以逗號為分隔符的資料
pd.read_csv
>>> dataframe = pd.read_csv(r"C:\Users\Administrator\Desktop\data.txt", header=None) # 預設就是以 , 為分隔符。
>>> dataframe
0 1 2 3 4 5 6 7
0 46.19 99.74 29.00 86.38 52.35 29.89 99.07 83.01
1 24.16 99.99 27.88 43.85 40.05 28.84 99.89 82.92
...
13 97.58 99.43 28.53 81.55 80.44 27.40 84.57 82.59
14 95.23 97.37 28.19 63.28 86.51 26.90 73.27 82.08
pd.read_table
>>> dataframe = pd.read_table(r"C:\Users\Administrator\Desktop\data.txt", header=None, delimiter=',')
>>> dataframe
0 1 2 3 4 5 6 7
0 46.19 99.74 29.00 86.38 52.35 29.89 99.07 83.01
1 24.16 99.99 27.88 43.85 40.05 28.84 99.89 82.92
...
13 97.58 99.43 28.53 81.55 80.44 27.40 84.57 82.59
14 95.23 97.37 28.19 63.28 86.51 26.90 73.27 82.08
常見錯誤
OSError: Initializing from file failed
出現這個錯誤的原因很可能是你的路徑名中帶有中文
解決方案有兩種2
- 在 read_csv 之前先用 open 函式
f = open('人效日報-20180701.csv')
data = pd.read_csv(f, skiprows=1, header=None)
- 不加 open 函式,在 read_csv 裡面設定 engine 引數
data = pd.read_csv('人效日報-20180701.csv', skiprows=1, header=None, engine='python')
後話
我們同樣也有一系列以 to_
開頭函式來講 DataFrame 物件寫入檔案中。如果你寫入的時候不想將 header 和 index 寫入檔案中,可以指定對應引數為 None