輸入輸出一般分為下面幾類:讀取文本文件和其他更高效的磁盤存儲格式,加載數據庫中的數據。利用Web API操作網絡資源。
1、讀寫文本格式的數據
自己感覺讀寫文件有時候“需要運氣”,經常需要手工調整。因為其簡單的文件交互語法、直觀的數據結構,以及諸如元組打包解包之類的便利功能,Python在文本和文件處理方面已經成為一門招人喜歡的語言。pandas提供了一些用於將表格型數據讀取為DataFrame對象的函數。見下表:
下面大致介紹一下這些函數在文本數據轉換為DataFrame時的一些技術。可以分為一下幾類:
-
索引:將一個或者多個列當作返回的DataFrame處理,以及是否從文件、用戶獲取列名。
-
類型推斷和數據轉換:包括用戶定義值的轉換、缺失值標記列表等。
-
日期解析:包括組合功能,比如將分散在多個列中的日期時間信息組合成結果中的單個列。
-
迭代:支持對大文件進行逐塊迭代。
-
不規整數據問題:跳過一些行、頁腳、注釋或者其他不要的東西
pandas讀取文件會自動推斷數據類型,不用指定。
read_csv為例
用names重新規定列名,用index_col指定索引,也可以將多個列組合作為層次化索引。可以編寫正則表達式規定分隔符。用skiprows跳過某些行。pandas會用NA、-1.#IND、NULL等進行標記。用na_values用來不同的NA標記值。下面是read_csv/read_table參數:
逐塊讀取文本文件
處理很大的文件時,或找出大文件中的參數集以便於后續處理時,可能只想讀取一部分或者逐塊對文件進行迭代。nrows指定讀取多少行。要逐塊讀取文件,需要設置chunksize(行數)。
將數據寫出到文本格式
用to_csv方法寫出到csv文件中。參數sep標明分隔符。na_rep標明空白字符串的代替值。index header標明是否寫出行列標簽,默認是寫出。用cols限制並以指定順序寫出某些列。
Series也有to_csv方法。用一些整理工作(無header行,第一列作索引)就能用read_csv讀取為Series,當然還有一個更方便的from_csv,Series.from_csv。
手工處理分隔符格式
有些奇葩文件需要進行處理以后再讀。Python內置的csv模塊可以讀取任何單字符分隔符文件。將打開的文件傳遞給csv.reader。csv文件的形式有很多,只需定義csv.Dialect的一個子類即可定義新格式(如專門的分隔符、字符串引用約定、行結束符等):
#-*- encoding:utf-8 -*- import numpy as np import os import pandas as pd from pandas import Series,DataFrame import matplotlib.pyplot as plt import pandas.io.data as web import csv f = open('ex6.csv') reader = csv.reader(f) for line in reader: print line lines = list(csv.reader(open('ex7.csv'))) header,values = lines[0],lines[1:] print header print values #下面的 * 應該是取出值的意思 data_dict = {h:v for h,v in zip(header,zip(*values))} print data_dict class my_dialect(csv.Dialect): lineterminator = '\n' delimiter = ';' quotechar = '"' reader = csv.reader(f,dialect=my_dialect) #csv語支的參數也可以用參數的形式給出 reader = csv.reader(f,delimiter = '|')
對於那些使用復雜分隔符或多字符分隔符的文件,csv文件就無能為力了。這種情況下用split或者re.split進行拆分合整理工作。要手工輸出分隔符文件,可以使用csv.writer。它接受一個已打開且可寫的文件對象以及跟cav.reader相同的那些語支和格式化選項。
#-*- encoding:utf-8 -*- import numpy as np import os import pandas as pd from pandas import Series,DataFrame import matplotlib.pyplot as plt import pandas.io.data as web import csv with open('mydata.csv','w') as f: writer = csv.writer(f,lineterminator = '\n') writer.writerow(('one','two','three')) writer.writerow(('1','2','3'))
JSON數據
除空值null和一些其他的細微差別(如列表末尾不允許存在多余的逗號)之外,JSON非常接近有效Python代碼。基本數據類型有對象(字典)、數組(列表)、字符串、數值、布爾值以及NULL。對象中所有的鍵都必須是字符串(非常重要)。用json模塊,json.loads可以將字符串轉換成Python形式,即可以將對象讀取為python字典。
相反的,json.dumps可以將python對象轉換為json格式。
XML和HTML:Web信息收集
lxml可以讀取xml和html格式數據並處理。這部分用到的時候再研究。
2、二進制數據文件
實現數據的二進制格式最簡單的方法之一是使用Python內置的pickle序列化。為了使用方便,pandas對象都有一個用於將數據以pickle形式保存到磁盤上的save方法。
#-*- encoding:utf-8 -*- import numpy as np import os import pandas as pd from pandas import Series,DataFrame import matplotlib.pyplot as plt import pandas.io.data as web import csv frame = pd.read_csv('ex1.csv') print frame frame.save('frame_pickle') #存儲為二進制文件 ok = pd.load('frame_pickle') #load函數 #ok1 = pd.read_table('frame_pickle') #不能用read_table函數 #print ok1 print ok
pickle,作者建議用作短期存儲,因為會遇到解析版本問題。
使用HDF5格式
很多工具都能實現高效讀寫磁盤上以二進制格式存儲的科學數據。HDF5就是一個流行工業級庫,是一個C庫,有Java、Python、MATLAB等多種接口。這部分暫時不看。
讀取Excel數據
支持excel2003及更高版本的excel文件。用pandas中的ExcelFile類即可,需要安裝xlrd和openpyxl包。
#-*- encoding:utf-8 -*- import numpy as np import os import pandas as pd from pandas import Series,DataFrame import matplotlib.pyplot as plt import pandas.io.data as web import csv xls_file = pd.ExcelFile('ex1.xlsx') table = xls_file.parse('ex1') print table
使用HTML和Web API
許多網站都有一些通過JSON或其他格式提供數據的公共API。用requests包等可以實現。這部分暫時不看。
使用數據庫
數據從SQL中加載到DataFrame比較簡單,此外pandas還有一些能夠簡化該過程的函數。作者是用一款SQLite數據庫,用sqlite3驅動器。作者還舉了MongoDB中數據的例子。暫時不看。