Python -- 數據加載、存儲與文件格式

標籤(空格分隔): Pythonhtml


讀入讀出一般能夠劃分爲幾個大類:讀取文本文件和其餘更高效的磁盤存儲格式,加載數據庫中的數據,利用Web API操做網絡資源。web

讀寫文本格式的數據

pandas提供了一些用於將表格型數據讀取爲DataFrame對象的函數,以下表所示:正則表達式

函數 說明
read_csv 從文件、URL、文件型對象中加載帶分隔符的數據。默認分隔符爲,
read_table 從文件、URL、文件型對象中加載帶分隔符的數據,默認的分隔符爲製表符"\t"
read_fwf 讀取定寬列格式數據 -- 木有分隔符的
read_clipboard 讀取剪貼板中的數據,能夠看作read_table的剪貼板。將網頁轉換爲表格時頗有用

for example:sql

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語句和鏈接對象
相關文章
相關標籤/搜索