读取Microsoft Excel文件
Excel作为最典型的表格型数据,我们需要用到ExcelFile
对象,首先需要下载安装xlrd
和openpyxl
包
In [11]: xls_file = pd.ExcelFile('ex1.xlsx')
In [12]: table = xls_file.parse('Sheet1')
In [13]: table
Out[13]:
Unnamed: 0 a b c d message
0 0 1 2 3 4 hello
1 1 5 6 7 8 world
2 2 9 10 11 12 foo
用requests与Web API做交互
Python中最常用也是最方便的访问API的库requests
requests官方文档
In [19]: url = 'https://api.github.com/search/repositories?q=language:python&sort=stars'
In [20]: resp = requests.get(url)
In [21]: resp
Out[21]: <Response [200]>
In [30]: data = resp.json()
In [32]: frame = DataFrame(data)
In [33]: frame
Out[33]:
total_count incomplete_results items
0 3747517 False {'id': 21289110, 'node_id': 'MDEwOlJlcG9zaXRvc...
1 3747517 False {'id': 83222441, 'node_id': 'MDEwOlJlcG9zaXRvc...
2 3747517 False {'id': 54346799, 'node_id': 'MDEwOlJlcG9zaXRvc...
3 3747517 False {'id': 51117837, 'node_id': 'MDEwOlJlcG9zaXRvc...
4 3747517 False {'id': 1039520, 'node_id': 'MDEwOlJlcG9zaXRvcn...
5 3747517 False {'id': 596892, 'node_id': 'MDEwOlJlcG9zaXRvcnk...
6 3747517 False {'id': 33614304, 'node_id': 'MDEwOlJlcG9zaXRvc...
7 3747517 False {'id': 4164482, 'node_id': 'MDEwOlJlcG9zaXRvcn...
8 3747517 False {'id': 3544424, 'node_id': 'MDEwOlJlcG9zaXRvcn...
9 3747517 False {'id': 33015583, 'node_id': 'MDEwOlJlcG9zaXRvc...
10 3747517 False {'id': 21872392, 'node_id': 'MDEwOlJlcG9zaXRvc...
11 3747517 False {'id': 1362490, 'node_id': 'MDEwOlJlcG9zaXRvcn...
12 3747517 False {'id': 3638964, 'node_id': 'MDEwOlJlcG9zaXRvcn...
13 3747517 False {'id': 843222, 'node_id': 'MDEwOlJlcG9zaXRvcnk...
14 3747517 False {'id': 529502, 'node_id': 'MDEwOlJlcG9zaXRvcnk...
15 3747517 False {'id': 63476337, 'node_id': 'MDEwOlJlcG9zaXRvc...
16 3747517 False {'id': 40416236, 'node_id': 'MDEwOlJlcG9zaXRvc...
17 3747517 False {'id': 4086616, 'node_id': 'MDEwOlJlcG9zaXRvcn...
18 3747517 False {'id': 29290473, 'node_id': 'MDEwOlJlcG9zaXRvc...
19 3747517 False {'id': 26516210, 'node_id': 'MDEwOlJlcG9zaXRvc...
20 3747517 False {'id': 5483330, 'node_id': 'MDEwOlJlcG9zaXRvcn...
21 3747517 False {'id': 81598961, 'node_id': 'MDEwOlJlcG9zaXRvc...
22 3747517 False {'id': 83844720, 'node_id': 'MDEwOlJlcG9zaXRvc...
23 3747517 False {'id': 12888993, 'node_id': 'MDEwOlJlcG9zaXRvc...
24 3747517 False {'id': 136328388, 'node_id': 'MDEwOlJlcG9zaXRv...
25 3747517 False {'id': 70905478, 'node_id': 'MDEwOlJlcG9zaXRvc...
26 3747517 False {'id': 139824423, 'node_id': 'MDEwOlJlcG9zaXRv...
27 3747517 False {'id': 41058054, 'node_id': 'MDEwOlJlcG9zaXRvc...
28 3747517 False {'id': 15019962, 'node_id': 'MDEwOlJlcG9zaXRvc...
29 3747517 False {'id': 873328, 'node_id': 'MDEwOlJlcG9zaXRvcnk...
使用数据库
在存储大量数据的情况中,使用SQL数据库无疑是个最佳的选择。
通过sqlite3
创建一个数据库
In [34]: import sqlite3
In [35]: query = """
...: CREATE TABLE test
...: (a VARCHAR(20), b VARCHAR(20),
...: c REAL, d INTERGER);"""
In [36]: con = sqlite3.connect('testdata.sqlite')
In [37]: con.execute(query)
Out[37]: <sqlite3.Cursor at 0x12042d490>
In [38]: con.commit()
然后插入几行数据
In [40]: data = [('Atlanta', 'Georgia', 1.25, 6),('Tallahassee','Florida',2.6, 3),('Sacramento','Cali
...: fornia',1.7, 5)]
In [41]: stmt = "INSERT INTO test VALUES(?,?,?,?)"
In [42]: con.executemany(stmt, data)
Out[42]: <sqlite3.Cursor at 0x12042d960>
In [43]: con.commit()
接下来从数据库中选取数据,大部分Python SQL驱动器都会返回一个元组列表:
In [44]: cursor = con.execute('select *from test')
In [45]: rows = cursor.fetchall()
In [46]: rows
Out[46]:
[('Atlanta', 'Georgia', 1.25, 6),
('Tallahassee', 'Florida', 2.6, 3),
('Sacramento', 'California', 1.7, 5)]
将这个元组传给DataFrame
,还需要列名(在description
属性中)
In [47]: cursor.description
Out[47]:
(('a', None, None, None, None, None, None),
('b', None, None, None, None, None, None),
('c', None, None, None, None, None, None),
('d', None, None, None, None, None, None))
In [53]: frame = DataFrame(rows, columns=[x[0] for x in cursor.description])
In [54]: frame
Out[54]:
a b c d
0 Atlanta Georgia 1.25 6
1 Tallahassee Florida 2.60 3
2 Sacramento California 1.70 5
**操作步骤略显繁琐,其实SQLALchemy
项目可以解决这个问题(安装之)。pandas中的read_sql
函数可以结合它一起使用。
In [61]: db = sqla.create_engine('sqlite:///testdata.sqlite')
In [62]: pd.read_sql('select * from test',db)
Out[62]:
a b c d
0 Atlanta Gerogia 1.25 6
1 Tallahassee Florida 2.60 3
2 Sacramento California 1.70 5
总结:
本章中学习了如何加载与存储常用的文件格式,在Python中不同的文件格式需要用到不同的包,有些需要配合Python自带的函数一起使用。
处理Html文件 需要pandas结合beautifulsoup
可很方便的读取html文件并转换成DataFrame
格式
处理XML文件 需要用到lxml
库中的objectify
对象,通过objectify.parse
函数直接解析,解析后可直接获取xml的根节点root
利用StringIO
也可以解析字符串形式的html
处理Excel文件 配合xlrd
和openpyxl
包,ExcelFile
对象也可以直接解析Excel文件并转成DataFrame
。
与WebAPI交互 requests
包完美解决了Python与WebAPI交互的问题,使用方便效率高。
使用数据库 Python的sqlite3
包含了数据库操作的基本功能,缺点是操作繁琐。而比较流行的项目SQLALchemy
则非常适合作为Python的数据库操作工具。
网友评论