pandas-read-file

读取Microsoft Excel文件

Excel作为最典型的表格型数据,我们需要用到ExcelFile对象,首先需要下载安装xlrdopenpyxl

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文件 配合xlrdopenpyxl包,ExcelFile对象也可以直接解析Excel文件并转成DataFrame
与WebAPI交互 requests包完美解决了Python与WebAPI交互的问题,使用方便效率高。
使用数据库 Python的sqlite3包含了数据库操作的基本功能,缺点是操作繁琐。而比较流行的项目SQLALchemy则非常适合作为Python的数据库操作工具。