學習時間:2019/10/20 周日下午17點開始。
學習目標:Page164-Page,共23頁,目標3天學完,每天8頁,預期1021學完。
實際反饋:第一天較為集中的學習7頁,用時2.5小時。實際1025學完,耗時5天,2.5+5*1=7.5小時
- 輸入輸出通常可划分為幾個大類:
讀取文本文件和其他更高效的磁盤存儲格式,加載數據庫中的數據,利用Web API操作網絡資源。
6.1 讀寫文本格式的數據
pandas提供了一些用於將表格型數據讀取為DataFrame對象的函數,總結如下表。
其中,read_csv和read_table可能會在今后用的最多。
表6-1
Ps:簡介這些函數在將文本數據轉換為DataFrame時多用到的一些技術。這些函數的選項可划分為以下幾個大類:
- 索引:將一個或多個列當做返回的DataFrame處理,以及是否從文件、用戶獲取列名。
- 類型推斷和數據轉換:包括用戶定義值的轉換、和自定義的缺失值標記列表等。
- 日期解析:包括組合功能,比如將分散在多個列中的日期時間信息組合成結果中的單個列。
- 迭代:支持對大文件進行逐塊迭代。
- 不規整數據問題:跳過一些行、頁腳、注釋或其他一些不重要的東西(比如由成千上萬個逗號隔離開的數值數據)。
1)使用read_csv讀取以逗號分隔的(CSV)文本文件:
Ps:Win環境下,文件路徑的書寫格式以下 3 種均正確:
df = pd.read_csv(r"D:\Python\examples\ex1.csv")
df1 = pd.read_csv("D:/Python/examples/ex1.csv")
df2 = pd.read_csv("D:\\Python\\examples\\ex1.csv")
2)還可使用read_table讀取CSV文件,並指定分隔符:
3)並非所有文件都有標題,如下圖所示。讀入該類文件有如下兩種方法:
Ps1:win系統下,用cmd通過Type命令查看文件文本內容方法:
1 - 按下快捷鍵:WIN+R,調出運行窗口,輸入:CMD;
2 - CMD的TYPE指令,語法:type 驅動器:\文件夾\文件名
3 - 示例:type D:\Python\examples\ex2.csv
Ps2:win系統下,IPython中通過type查看文件文本內容方法:
! type "D:\Python\examples\ex4.csv" ——絕對路徑
方法一:可以讓pandas為其分配默認的列名;
方法二:利用pandas為其自定義列名:
Ps:如果希望將message列做成DataFrame的索引。可明確表示要將該列放到索引 4 的位置上,也可通過index_col參數指定“message”:
4)將多個列做成一個層次化索引,只需傳入列編號或列名組成的列表即可:
5)有的情況下,有些表格可能不是用固定的分隔符去分隔字段的(比如,空白符或其他模式)
如,讀取下面的文本文件:
雖然可手動對數據進行規整,但是較為繁瑣。該情況下,可傳遞一個正則表達式作為read_table的分隔符。可用正則表達式:\s+
(\s匹配任何空白字符,包括空格、制表符、換頁符等等, 等價於[ \f\n\r\t\v];“\s+”則表示匹配任意多個上面的字符)
解析器函數還有許多參數可以幫助處理各種各樣的異形文件格式(如表6-2中所示)。簡單示例,可用skiprows跳過文件的第一行、第三行和第四行:
6)處理缺失值
缺失值處理,時文件解析任務中的一個重要組成部分。缺失數據經常沒有(空字符串),或用某個標記值表示。
默認情況下,pandas會用一組經常出現的標記值進行識別,比如NA或NULL。
na_values可以用一個列表或集合的字符串表示缺失值(???嘗試多種方式,似乎並無作用)
字典的各列可以使用不同的NA標記值:
表6-2 pandas.read_csv / pandas.read_table函數的常用參數選項
6.1.1 逐塊讀取文本文件
當在處理很大的文件時,或找出大文件中的參數集以便於后續處理時,可能只想讀取文件的一小部分,或者逐塊對文件進行迭代。
在看大文件前,可先設置pandas顯示更加緊湊:
1)如果只想讀取幾行,通過nrows進行指定即可:
2)可通過指定chunksize(行數),進行逐塊讀取文件 ???有問題不懂
read_csv所返回的這個TextParser對象使你可以根據chunksize對文件進行逐塊迭代。
如,對ex6.csv進行迭代處理,將值計數聚合到“key”列中:
???????
6.1.2 將數據寫出到文本格式
1)利用DataFrame的to_csv方法,將數據寫到一個以逗號分隔的文件中
先讀取一個csv文件:
Ps:還可使用其他分隔符:
注:因此處直接寫出到sys.stdout,故僅僅是打印出文本結果
缺失值在輸出結果中會被表示為空字符串。如果希望將其表示為別的標記值:
注:因此處直接寫出到sys.stdout,故僅僅是打印出文本結果
禁用行和列的標簽:
自定義輸出列,並按指定順序排列:
2)Series用to_csv方法
6.1.3 處理分隔符格式
大部分存儲在磁盤上的表格型數據都能用pandas.read_table進行加載。但對於含有畸形行的文件,則該方法可能無法處理。介紹其他方法如下:
1)對於任何單字符分隔文件,可以直接用python內置的csv模塊,將任意已打開的文件或文件型的對象傳給csv.reader。
對這個reader進行迭代將會為每行產生一個元組(並移除所有的引號):
注意:open()函數使用時,一定要加上encoding='utf-8',否則會進行報錯:UnicodeDecodeError
!!!延申:read_csv時開頭出現 \ufeff ,且引號並未完全去除,不符合預期。
首行出現的“\ufeff”叫BOM("ByteOrder Mark")用來聲明該文件的編碼信息。
“utf-8”是以字節為編碼單元,它的字節順序在所有系統中都是一樣的,沒有字節序問題,因此它不需要BOM,所以當用"utf-8"編碼方式讀取帶有BOM的文件時,它會把BOM當做是文件內容來處理, 也就會發生類似上邊的錯誤.
"uft-8-sig"中sig全拼為 signature 也就是"帶有簽名的utf-8",因此"utf-8-sig"讀取帶有BOM的"utf-8文件時"會把BOM單獨處理,與文本內容隔離開,也是我們期望的結果.
————————————————
參考文獻:
https://blog.csdn.net/wozaizhe56/article/details/82048645
https://blog.csdn.net/vernice/article/details/46873169
2)創建數據列的字典,使得數據格式合乎要求。
第一步,讀取文件到一個多行的列表中:
第二步,將這些行分為標題行和數據行:
第三步,用字典構造式和zip(*values),后者將行轉置為列,創建數據列的字典:
注意:上述為標准方法,值得學習模板;
收集參數 *value的含義,可參考該鏈接復習:https://www.cnblogs.com/ElonJiang/p/11440695.html
函數zip可用於“縫合”任意數量的序列,可參考鏈接復習:https://www.cnblogs.com/ElonJiang/p/11355846.html
3)CSV文件的形式很多,只需定義 csv.Dialect的一個子類即可定義出新格式(如專門的分隔符、字符串引用約定、行結束符等):
Ps:各個CSV語支的參數也可用關鍵字的形式提供給csv.reader,而無需定義子類:
6.1.4 JSON數據
JSON(JavaScript Object Notation的簡稱),已經成為通過HTTP請求在Web瀏覽器和其他應用程序之間發送數據的標准格式之一。比表格型文本格式(如CSV)靈活的多。
JSON非常接近於有效的Python代碼。
基本類型有:對象(字典)、數組(列表)、字符串、布爾值以及null。對象中所有鍵都必須是字符串。
使用Python標准庫中的 json模塊 讀寫JSON數據,通過json.loads可將JSON字符串轉換成Python形式。
1)一個JSON數據例子
2)將該JSON數據用 json.loads將其轉換成Python形式
Ps:json.dumps則是將Python對象轉換成JSON格式
3)將JSON對象轉換為DateFrame或Series或其他便於分析的數據結構
方法一(最簡單):向Dateframe構造器傳入一個字典的列表(就是原先的JSON對象),並選取數據字段的子集
方法二:用pandas.read_json自動將特別格式的JSON數據集轉換為Series或DataFrame
data = pd.read_json(r"D:\Python\examples\example.json", encoding='utf-8') --報錯!!!???
Ps:此處一直報錯,ValueError: Unexpected character found when decoding array value (1),嘗試添加encoding=‘utf-8' 無結果
6.1.5 XML和HTML:Web信息收集
Python有許多可讀寫常見HTML和XML格式數據的庫,包括lxml、Beautiful Soup和html5lib。其中,lxml的速度比較快,但是其他庫處理有誤的HTML或XML文件更好。
pandas一個內置功能,read_html,它可使用lxml和Beautiful Soup子集將HTML文件中的表格解析為DataFrame對象。
需安裝read_html用到的庫lxml
示例暫無!!!
6.1.6 利用lxml.objectify解析XML