標簽(空格分隔): Python
讀入讀出通常可以划分為幾個大類:讀取文本文件和其他更高效的磁盤存儲格式,加載數據庫中的數據,利用Web API操作網絡資源。
讀寫文本格式的數據
pandas提供了一些用於將表格型數據讀取為DataFrame對象的函數,如下表所示:
| 函數 | 說明 |
|---|---|
| read_csv | 從文件、URL、文件型對象中加載帶分隔符的數據。默認分隔符為, |
| read_table | 從文件、URL、文件型對象中加載帶分隔符的數據,默認的分隔符為制表符"\t" |
| read_fwf | 讀取定寬列格式數據 -- 木有分隔符的 |
| read_clipboard | 讀取剪貼板中的數據,可以看做read_table的剪貼板。將網頁轉換為表格時很有用 |
for example:
In[]: import pandas as pd
In[]: df = pd.read_csv('ex1.csv') # ''內寫入文件所在的詳細目錄
In[]: df = pd.read_table('ex1.csv', sep = ',') # 或者使用table並指定分隔符
# 當你要讀入的文件沒有標題行時:
In[]: df = pd.read_csv('ex2.csv', header = None) # 讓pandas為其分配默認的列名
In[]: df = pd.read_csv('ex2.csv', names = ['a','b','c','d','message']) # 自己定義標題行
In [8]: names = ['a','b','c','d','message']
# 讓其中的某列作為列索引
In [9]: pd.read_csv('ex2.csv', names = names, index_col = 'message')
Out[9]:
a b c d
message
hello 1 2 3 4
world 5 6 7 8
foo 9 10 11 12
In[]: pd.read_csv('ex4.csv', skiprows = [0, 2, 3]) # 略過第0,2,3行不讀取
# 用一個字典為各列指定不同的NA標記值
In[]: patterns = {'message':['foo', 'NA'], 'something':['two']}
In[]: pd.read_csv('ex5.csv', na_values=patterns)
read_csv/read_table函數的參數
| 參數 | 說明 |
|---|---|
| path | 表示文件系統位置、URL、文件型對象的字符串 |
| sep/delimiter | 用於對行中各字段進行拆分的字符序列或正則表達式 |
| header | 用作列名的行號。如果沒有header行就應該設置為None |
| index_col | 用作行索引的列編號或列名,可以是單個名稱/數字或由多個名稱/數字組成的列表 |
| names | 用於結果的列名列表,結合header = None |
| skiprows | 需要忽略的行數 |
| na_values | 一組用於替換NA的值 |
| comment | 用於將注釋信息從行尾拆分出去的字符 |
| parse_dates | 嘗試將數據解析為日期 |
| nrows | 需要讀取的行數 |
| skip_footer | 需要忽略的行數 |
逐塊讀取文本文件
In[]: pd.read_csv('ex6.csv', nrows=5)
將數據寫出到文本
In[]: data = pd.read_csv('ex5.csv')
In[]: data.to_csv('out.csv') # 將data中的數據寫出到當前目錄中的out.csv中
In[]: data.to_csv(sys.stdout, sep='|') # 打印到屏幕
In[]: data.to_csv(sys.stdout, na_rep='NULL') # 空字符處顯示為NULL
In[]: data.to_csv(sys.stdout, index=False, header=False) # 禁用行和列的標簽
In[]: data.to_csv(sys.stdout, index=False, cols=['a', 'b', 'c']) # 按照指定的順序顯示列
# Series中的to_csv方法
In [39]: dates = pd.date_range('1/1/2000', periods = 7)
In [40]: dates
Out[40]:
DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-03', '2000-01-04', '2000-01-05', '2000-01-06', '2000-01-07'], dtype='datetime64[ns]', freq='D')
In [45]: ts = Series(np.arange(7), index = dates)
In [46]: ts
Out[46]:
2000-01-01 0
2000-01-02 1
2000-01-03 2
2000-01-04 3
2000-01-05 4
2000-01-06 5
2000-01-07 6
Freq: D, dtype: int64
In [47]: ts.to_csv('tseries.csv')
In [48]: cat tseries.csv
2000-01-01,0
2000-01-02,1
2000-01-03,2
2000-01-04,3
2000-01-05,4
2000-01-06,5
2000-01-07,6
In[]: Series.from_csv('tseries.csv',parse_dates = False) # 從文件中讀入到Series
手工處理分隔符
In [50]: cat ex7.csv
"a","b","c"
"1","2","3"
"1","2","3","4"
In [51]: import csv
In [52]: f = open('ex7.csv')
In [53]: reader = csv.reader(f)
In [54]: for line in reader:
...: print line
...:
['a', 'b', 'c']
['1', '2', '3']
['1', '2', '3', '4']
# 可以對數據做一些處理
In[]: lines = list(csv.reader(open('ex7.csv')))
In[]: header, values = lines[0], lines[1:]
In[]: data_dict = {h:v for h,v in zip(header, zip(*values))}
- CSV語支選項
| 參數 | 說明 |
|---|---|
| delimiter | 用於分割字段的單字符字符串,默認為',' |
| lineterminator | 用於寫操作的行結束符,默認為'\r\n'。讀操作將忽略此選項 |
| quotechar | 用於帶有特殊字符的字段的引用符號,默認為'"' |
JSON數據
JSON(JavaScript Object Notation)已經成為通過HTTP請求在Web瀏覽器和其他應用程序之間發送數據的標准格式之一。
import json
In [65]: obj = """{"name":"Wes", "places_lived":["United States", "Spain", "Germany"], "pet":nu
...: ll, "siblings":[{"name":"Scott","age":25,"pet":"Zuko"},{"name":"Katy","age":33,"pet":"
...: Cisco"}]}"""
In [68]: res = json.loads(obj) # 將JSON字符串轉換為Python形式
In [69]: res
Out[69]:
{u'name': u'Wes',
u'pet': None,
u'places_lived': [u'United States', u'Spain', u'Germany'],
u'siblings': [{u'age': 25, u'name': u'Scott', u'pet': u'Zuko'},
{u'age': 33, u'name': u'Katy', u'pet': u'Cisco'}]}
# 將Python轉換為json
In [71]: asjson = json.dumps(res)
In [72]: asjson
Out[72]: '{"pet": null, "siblings": [{"pet": "Zuko", "age": 25, "name": "Scott"}, {"pet": "Cisco", "age": 33, "name": "Katy"}], "name": "Wes", "places_lived": ["United States", "Spain", "Germany"]}'
In[]: data = DataFrame(res['siblings'], columns=['name', 'age'])
In [75]: data
Out[75]:
name age
0 Scott 25
1 Katy 33
使用HTML和Web API
import requests
In[]: url = 'http://www.baidu.com'
In[]: resp = requests.get(url)
In[]: import json
In[]: data = json.loads(resp.text) # Response對象的text屬性含有GET請求的內容,大多返回JSON對象,加載到Python對象中
In[]: data.keys()
使用數據庫
In[]: import sqlite3
In[]: query = """create table test(a varchar(20), b varchar(20), c real, d integer);"""
In[]: con = sqlite3.connect(':memory:') # 連接數據庫
In[]: con.execute(query)
In[]: con.commit()
In[]: data = [('Atlanta', 'Georgia', 1.25, 6), ('Tall', 'Flor', 2.6, 3), ('Saca', 'Calif', 1.7, 5)]
In[]: stmt = "insert into test values(?, ?, ?, ?)"
In[]: con.execute(stmt, data)
In[]: con.commit()
In[]: datas = con.execute('select * from test')
In[]: lines = datas.fetchall() # 從表中讀取數據,將返回一個元祖列表
In[]: datas.description # 獲得列名
In[]: DataFrame(rows, columns=zip(*datas.description)[0])
In[]: import pandas.io.sql as sql
In[]: sql.read_frame('select * from test', con) # 傳入sql語句和連接對象
