您的位置:首页 > 编程语言 > Python开发

Python中数据加载、存储与文件格式

2017-01-11 15:03 549 查看
摘自《利用Python进行数据分析》—— Wes McKinney

读写文本格式的数据

pandas中的解析函数:

函数说明
read_csv从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为逗号
read_table从文件、URL、文件型对象中加载带分隔符的数据。默认分隔符为制表符(“\t”)
read_fwf读取定宽列格式的数据(也就是说,没有分隔符)
read_clipboard读取剪贴板中的数据,可以看作read_table的剪贴板版。在将网页转换为表格式时很有用
我将大致介绍一下这些函数在将文本数据转换为DataFrame时所用到的一些技术。这些函数的选项可以划分为以下几个大类:

索引:将一个或多个列当作返回的DataFrame处理,以及是否从文件、用户获取列名。

类型推断和数据转换:包括用户定义值的转换、缺失值标记列表等。

日期解析:包括组合功能,比如将分散在多个列中的日期时间信息组合成结果中的单个列。

迭代:支持对大文件进行逐块迭代

不规整数据问题:跳过一些行、页脚、注释或者其他一些不重要的东西(比如有成千上万个逗号隔开的数值数据)。

对于常用的pd.read_csv(),官方给出划分:

类别参数
Beginfilepath_or_buffer, sep=’,’, delimiter
Column and Index Location and Namesheader, names, idex_col, usecols, squeeze, prefix, mangle_dupe_cols
General Parsing Configurationdtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, nrows
NA and Missing Data Handlingna_values, keep_default_na, na_filter, verbose, skip_blank_lines
Datetime Handlingparse_date, infer_datetime_format, keep_date_col, date_parser, dayfirst
Iterationiterator, chunksize
Quoting, Compression, and File Formatcompression, thousands, decimal, lineterminator, quotechar, quating, escapechar, comment, encoding, dialect, tupleize_clos
Error Handlingerror_bad_lines, warn_bad_lines
Internalskipfooter, skip_footer, doublequote, delim_whitespace, as_recarray, compact_ints, use_unsigned, low_memory, buffer_lines, memory_map, float_precision
对于函数pd.read_csv(),
header=None
时pandas分配默认列名,需输入参数
names
,然后可以通过
index_col=列名或[列名列名](MultiIndex)
将某一列作为索引,当然在values中这列就不存在了。

逐块读取文本文件

如果指向读取几行(避免都去整个文件),通过
nrows=行数
进行指定即可。姚铸块读取文件,需要设置
chunksize=行数
,此时的pd.read_csv()返回的这个TextParser对象使你可以根据chunksize对文件进行逐块迭代,TextParser还有一个get_chunk方法,可以读取任意大小的块。

将数据写出到文本格式

利用DataFrame的
to_csv()
方法,可以将数据写到一个文件中。对于Series数据,可以通过
from_csv()
读取文件,用
to_csv()
输出文件。

JSON数据

JSON(JavaScript Object Notation)1已经成为通过HTTP请求再Web浏览器和其他应用程序之间发送数据的标准格式之一。它是一种比表格型文本格式(如CSV)灵活得多的数据格式。

将JSON字符串转换成Python形式:
json.loads()


将Python对象转换成JSON字符串:
json.dumps()


二进制数据格式

为了使用方便,pandas中的每一个对象都有一个用于将数据以pickle形式2保存到磁盘上的save方法:
testdf.save()
,并且通过
pd.load()
将数据都会到Python。

使用HTML和Web API

很多网站都有一些通过JSON或其他数据格式提供数据的公共API。通过Python访问这些API的一个简单易用的办法是requests包。

In [142]: import requests
In [143]: url = 'http://baidu.com'
In [144]: resp = requests.get(url)
In [145]: resp
Out[145]:
<Response [200]>
In [152]: resp.text
Out[152]:
u'<html>\n<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">\n</html>\n'


使用数据库

在许多应用中,数据很少取自文本文件,因为用这种方式存储大量数据很低小。基于SQL的关系型数据库(如SQLServer和MySQL等)使用非常广泛,此外还有一些非SQL(即所谓的NoSQL)型数据库也变得非常流行。将数据从SQL加载到DataFrame的过程很简单,此外pandas还有一些能够简化该过程的函数。例如,我将使用一款嵌入式的SQLite数据库3(通过Python内置的sqlite3驱动器):

# 创建数据库连接,创建表
In [153]: import sqlite3
In [154]: query = """CREATE TABLE test( a VARCHAR(20), b VARCHAR(20), c REAL, d INTEGER);"""
In [155]: con = sqlite3.connect(':memory:')
In [156]: con.execute(query)
Out[156]:
<sqlite3.Cursor at 0x767cf80>
In [157]: con.commit()

# 然后插入几行数据
In [158]: data = [('Atlanta', 'Georgia', 1.25, 6), ('Tallahassee', 'Florida', 2.6, 3), ('Sacramento', 'California', 1.7, 5)]
In [159]: stmt = "INSERT INTO test VALUES (?, ?, ?, ?)"
In [160]: con.executemany(stmt, data)
Out[160]:
<sqlite3.Cursor at 0x767cce0>
In [161]: con.commit()

# 从表中选取数据,大部分Python SQL驱动器(PyODBC, psycopg2, MySQLdb, pymssqb等)都会返回一个元组列表
In [162]: cursor = con.execute('select * from test')
In [163]: rows = cursor.fetchall()
In [164]: rows
Out[164]:

[(u'Atlanta', u'Georgia', 1.25, 6),
(u'Tallahassee', u'Florida', 2.6, 3),
(u'Sacramento', u'California', 1.7, 5)]

#可以将这个元组列表传给DataFrame构造器,但还需要列名(位于游标的description属性中)
In[165]: cursor.description
Out[165]:

(('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 [167]: zip(*cursor.description)
Out[167]:

[('a', 'b', 'c', 'd'),
(None, None, None, None),
(None, None, None, None),
(None, None, None, None),
(None, None, None, None),
(None, None, None, None),
(None, None, None, None)]
In [168]: pd.DataFrame(rows, columns=zip(*cursor.description)[0])
Out[168]:

a           b     c  d
0      Atlanta     Georgia  1.25  6
1  Tallahassee     Florida  2.60  3
2   Sacramento  California  1.70  5


这样导入DataFrame相当繁琐。pandas有一个可以简化该过程的
read_sql()
函数:

In [169]: import pandas.io.sql as sql
In [171]: sql.read_sql('select * from test', con)
Out[171]:

a           b     c  d
0      Atlanta     Georgia  1.25  6
1  Tallahassee     Florida  2.60  3
2   Sacramento  California  1.70  5
之后pandas团队会推出越来越多的json相关函数
pickle近建议用于短期存储格式,因为很难保证该格式是永远稳定的。
SQLite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是在世界上最广泛部署的 SQL 数据库引擎。SQLite 源代码不受版权限制。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 数据库 读写