输入输出通常可以划分为几大类:
读取文本文件和其他更高效的磁盘存储格式
加载数据库中的数据
利用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库解析