文本格式
1.解析函数
| 解析函数 | 说明 |
|---|---|
| read_csv | 文件、URL、文件型对象—有分隔符的数据(默认,) |
| read_table | 文件、URL、文件型对象—有分隔符的数据(默认\t) |
| read_fwf | 读取定宽,无分隔符 |
| read_clipboard | 读取剪贴板(read_table) |
功能:索引,类型推断和数据转化,日期解析,迭代,不规整数据问题
参数:
自定义列名:names=[]
列做索引:index_col='col_name'
分隔符:sep='\s+'不固定空格数
| read_csv/read_table 参数 | 说明 |
|---|---|
| path | 位置,URL,文件型对象 |
| sep或delimiter | 分隔符 |
| header | 列明行号,默认0,可选None |
| index_col | 索引的列编号或列名 |
| skiprows | 忽略行数 |
| na_values | 替换NA的值 |
| comment | 注释从行尾分出去的字符 |
| parse_dates | 解析为日期,默认False,可指定列号列名 |
| keep_date_col | 连接多列解析日期 |
| converters | 列号列名与函数之间的映射关系组成的字典,<br />{foo:f},foo列执行f函数 |
| dayfirst | 日期 |
| date_praser | 日期 |
| nrows | 读取的行数目 |
| iterator | 返回TextParser,逐块读取 |
| chunksize | 文件块的大小 |
| skip_footer | 忽略的行数(从行尾) |
| verbose | 打印解析器输出 |
| encoding | Unicode编码格式 |
| squeeze | 仅含一列时,返回Series |
| thousands | 千分位分隔符 |
逐块读取:
只读取几行:nrow=5,5行
逐块:chunksize=, 读取:TextParser
chunker = pd.read_csv('a.csv',chunksize=1000)
tot = Series([])
for piece in chunker:
tot = tot.add(piece['key'].value_counts(), fill_value=0)
写出to_csv:
禁用:index=False
仅部分列:cols=[]
缺失值为空:na_rep='Null'
Series也有to_csv方法
读取为Series:Series.from_csv()
手工处理分隔符格式:
import csv
f = open('a.csv')
reader = csv.reader(f)
for line in reader:
print line #元组形式
# 整理格式:dict
lines = list(reader)
header, values = lines[0],lines[:1]
data_dict = {h:v for h, v in zip(header, zip(*values))}
#传入子类
class my_dialect(csv.Dialect):
lineterminator = '/n'
delimier = ';'
quotechar = ':'
reader = csv.reader(f,dialect=my_dialect) #也可以关键字形式传入
| csv语句选项 | 说明 |
|---|---|
delimiter |
分隔符 |
lineterminator |
行尾符号 |
quotechar |
引用,带特殊字符的引用 |
quoting |
引用,(多个可选值) |
skipinitialspace |
忽略分隔符后的空格 |
doublequote |
引用符,True为双写 |
escapechar |
对分隔符进行转义的字符(quoting) |
手工输出分隔符文件:csv.writer
with open('a.csv', 'w') as f:
writer = csv.writer(f, dialect=my_dialect)
writer.writerow(...)
writer.writerow(...)
2.JSON
HTTP请求在Web和其他应用程序之间发送的数据标准格式之一
import json
# 载入或输出(dict),load和jump针对文件
result = json.loads(obj)
asjson = json.jumps(result)
# 转化为DataFrame
siblings = DataFrame(result['slibings'], columns=['name','age'])
3.HTML: lxml
from lxml.html import parse
from urllib2 import urlopen
# 获取 标签
parsed = parse(urlopen('http://funance.yahoo.com/q/op?s=AAPL+Options'))
doc = parsed.getroot() #获取根节点
# 查询a标签
links = doc.findall('./a')
# 获取url、文本
lnk = links[28]
lnk.get('href')
lnk.text_content()
# 推导式形式:a标签的href
urls = [lnk.get('href') for lnk in doc.findall('./a')]
# 找出表格
tables = doc.findall('./table')
calls = table[9]
puts = table[13]
# 找出row的所有'td'子标签的text
def _upack(row, kind='td'):
elts = row.findall('.//%s' % kind)
return [val.text_content() for val in elts]
# 自动转化类型TextParser:部分列转换为浮点
from pands.io.parsers import TextParser
def parse_options_data(table):
rows = table.findall('./tr') # 每行tr标签行
header = _unpack(row[0], kind='th') # 标题行
data = [_unpack(r) for r in rows[1:]] # 内容
return TextParser(data, names=header).get_chunk()
# 得到最终DataFrame
call_data = parse_options_data(calls)
put_data = parse_options_data(puts)
4.XML: lxml.objectify
常见的支持分层、嵌套、元数据的结构化数据格式
from lxml import objectify
path = '文件名'
parsed = objectify.parse(open(path))
root = parsed.getroot()
# 提取数据
data = []
skip_field = ['不需要','提取的','标签']
for elt in root.INDICATOR: # 所有indicator标签
for child in elt.children: # 遍历所有indicator标签的子标签
if child.tag in skip_field:
continue
el_data = {child.tag: child.pyval} #pyval属性得到对应的数据值,text字符串
data.append(el_data)
二进制
使用python内置的pickle序列化,仅使用短期存储
存储:frame.save()
读取:pd.load()
HDF5
高效读写磁盘上以二进制格式存储的科学数据,工业级库C库,有许多语言接口。每个HDF5都含有文件系统式的节点结构。分块读写,适合海量数据。
python中有两个接口:PyTables、h5py。
pandas有类似字典的HDFStore类,通过PyTables存储,可像字典一样获取
store = pd.HDFStore('mydata.h5') # 文件名
# 内容
store['obj1'] = frame
stroe['obj1_col1'] = frame['a']
Microsoft Excel
需要xlrd和openyxl包
# 创建实例
xls_file = pd.ExcelFile('data.xls')
# 读取sheet1
table = xls_file.parse('sheet1')
HTML和Web API: requests
import requests
import json
resp = request.get(url) #url网址,get请求
data = json.loads(resp.text) #text是内容,json加载
print(data.keys())
数据库
sqlite3
import sqlite3
query = """
CREATE TABLE test
(a VARCHAR(20), b VARCHAR(20),
c REAL, d INTEGER
);"""
con = sqlite3.connect(':memory:') #放在内存中
# conn=sqlite3.connect('urls.db') 链接数据库
con.execute(query)
con.commit()
# 查询,显示所有
cursor = con.execute('select * from test')
rows = cursor.fetchall() #fetchone
# description属性
print(cursor.description)
简化:read_frame()函数
import pandas.io.sql as sql
# 只需要语句和链接对象
sql.read_frame('select * from test', con)
MongoDB(NoSQL):pymongo
import pymongo
con = pymongo.Connection('localhost', port=27017) # 默认端口进行连接