数据加载\存储与文件格式

输入输出通常可以划分为几大类:

读取文本文件和其他更高效的磁盘存储格式
加载数据库中的数据
利用Web API操作网络资源

读写文本格式的数据

pandas中的解析函数

read_csv 从文件\URL\文件型对象中加载带分隔符的数据.默认分隔符为逗号
read_table 默认分隔符为制表符"\t"
read_fwf 读取顶宽列格式数据(没有分隔符)
read_clipboard 读取剪贴板中的数据,在网页转换为表格时很有用

这些函数的选项:

索引: 是否从文件\用户获取列名
类型推断和数据转换: 包括用户定义值的转换\缺失值标记列表
日期解析: 包括组合功能
迭代: 支持对大文件进行逐块迭代
不规整数据问题: 跳过一些行\页脚\注释或其他一些不重要的东西

window系统中
!type 绝对路径(不用引号且要使用"\")可以打印文本的原始内容

df = pd.read_csv('绝对路径')
也可以使用read_table,但是需要传入参数sep=','

可以通过index_col参数指定索引,若要指定层次化索引则传入列表即可

可以编写一个正则表达式作为read_table的分隔符

可以用skiprows=数字列表传入来跳过某些不去解析的行

缺失值处理,传入na_values参数

表6-2 包含read_csv\read_table函数的参数

逐块读取文本文件

传入nrows指定行;
传入chunksize对文件进行迭代,返回一个迭代对象

chunker=pd.read_csv('ch06/ex6.csv',chunksize=1000)
tot=Series([])
for piece in chunker:
tot=tot.add(piece['key'].value_counts(),fill_value=0)
tot=tot.order(ascending=False)

将数据写入到文本格式

data=pd.read_csv('ch06/ex5.csv')

利用DataFrame的to_csv方法,我们可以将数据写入到一个以逗号分隔的文件中
data.to_csv('ch06/out.csv')

还可以使用其他分隔符(由于这里写出到sys.stdout,所以仅仅是打印出文本结果)
data.to_csv(sys.stdout,sep='|')

缺失值在输出结果会被表示为空字符串,传入na_rep='NULL'可以表示为其他标记值
data.to_csv(sys.stdout,na_rep='NULL')

可以禁用行和列的标签
data.to_csv(sys.stdout,index=False,header=False)

还可以只写出一部分的列,并以指定的顺序排列
data.to_csv(sys.stdout,index=False,columns=['a','b','c'])

Series也有一个to_csv方法
dates=pd.date_range('1/1/2000',periods=7)
ts=Series(np.arange(7),index=dates)
ts.to_csv('ch06/tseries.csv')

虽然只需一点整理工作(无header行,第一列作索引)就能用read_csv将CSV文件读取为Series,但还有一个更为方便的from_csv方法
Series.from_csv('ch06/tseries.csv',parse_dates=True)

手工处理分隔符格式

import csv #python内置的csv模块
f = open('d:/python/data/ex7.csv')
reader = csv.reader(f) #将打开的文件对象传给csv.reader
for line in reader:
    print(line) #进行迭代会为每行产生一个列表(注意这里移除了源文件中的双引号)

In [50]: lines = list(csv.reader(open('d:/python/data/ex7.csv')))
...: header, values = lines[0], lines[1:]
...: data_dict = {h: v for h, v in zip(header, zip(*values))} #关于zip函数的应用
In [51]: data_dict
Out[51]: {'a': ('1', '1'), 'b': ('2', '2'), 'c': ('3', '3')}

CSV文件的形式有很多,只需定义csv.Dialect的一个子类即可定义出新格式(如专门的分隔符\字符串引用约定\行结束符等)
In [58]: class my_dialect(csv.Dialect):
...:    lineterminator = '\n'
...:    delimiter = ';'
...:    quotechar = '"'
...:    quoting = csv.QUOTE_MINIMAL
reader = csv.reader(f, diaect=my_dialect)

各个CSV语支的参数也可以以关键字的形式提供给csv.reader,而无需定义子类
reader = csv.reader(f, delimiter = '|')

表6-3: CSV语支选项

要手工输出分隔符文件,可以使用csv.writer. 它接受一个已打开且可写的文件对象,以及跟csv.reader相同的那些语支和格式化选项
In [64]: with open('mydata.csv', 'w') as f:
...:    writer = csv.writer(f, dialect=my_dialect)
...:    writer.writerow(('one', 'two', 'three'))
...:    writer.writerow(('1', '2', '3'))
...:    writer.writerow(('4', '5', '6'))
...:    writer.writerow(('7', '8', '9'))

JSON数据

import json

json.loads将JSON字符串转换成python形式
json.dumps将python对象转换成python形式

如何将JSON对象转换为DataFrame数据结构?
向DataFrame构造器传入JSON对象,并选取数据字段的子集
In [77]: obj = """
...: {"name": "Wes",
...:  "places_lived": ["United States", "Spain", "Germany"],
...:  "pet": null,
...:  "siblings": [{"name": "Scott", "age": 25, "pet": "Zuko"},
...:              {"name": "Katie", "age": 33, "pet": "Cisco"}]
...: }
...: """
In [80]: result = json.loads(obj)
In [81]: siblings = DataFrame(result['siblings'], columns=['name', 'age'])
In [82]: siblings
Out[82]:
    name  age
0  Scott  25
1  Katie  33

XML和HTML:Web信息收集

利用python爬虫获取信息,之后利用pandas的TextParser类做类型转换
from pandas.io.parsers import TextParser

利用lxml.objectify解析xml

二进制数据格式

最简单的方法之一:使用python内置的pickle序列化
frame=pd.read_csv('ch06/ex1.csv')
frame.to_pickle('ch06/frame_pickle')
pd.read_pickle('ch06/frame_pickle') #读取二进制数据

使用HDF5格式

store=pd.HDFStore('mydata.h5') #这个HDFStore是类似于字典的类
store['obj1']=frame
store['obj1_col']=frame['a']
store
File path: mydata.h5
/obj1                frame        (shape->[3,5])
/obj1_col            series      (shape->[3])
store['obj1']
a  b  c  d message
0  1  2  3  4  hello
1  5  6  7  8  world
2  9  10  11  12    foo
store.close() #关闭打开的HDF5文件
os.remove('mydata.h5') #移除刚才生成的文件

好好研究一下PyTables和h5py;许多数据分析问题都是IO密集型(而不是CPU密集型),利用HDF5这样的工具能显著提升应用程序的效率

警告: HDF5不是数据库. 它最适合用作"一次写多次读"的数据集. 虽然数据可以在任何时候被添加到文件中,但如果同时发生多个写操作,文件就可能被破坏.

读取Excel文件

ExcelFile类支持读取Excel表格型数据,需要安装xlrd和openpyxl包(anaconda已内置)
xls_file = pd.ExcelFile('data.xls')
table = xls_file.parse('Sheet1') #这里解析xls_file的第一个表格Sheet1

使用HTML和Web API

通过requests库访问API,再利用json库解析

使用数据库

存取MongoDB中的数据

推荐阅读更多精彩内容