本章的重点是利用Python来处理各种常见的编码形式所呈现的数据;比如CSV文件,JSON,XML以及二进制形式的打包记录。
1.读取CSV数据
解决方案:对于大部分的csv数据,都可以使用csv库来处理;
Python tablib模块是第三方模块,主要作用是将数据导出为各种不同的格式,包括excel,json,html,yaml,csv,tsv等格式
>>> import csv
>>> with open('d:\\cbs.csv') as f:
... f_csv = csv.reader(f)
... headers = next(f_csv)
... for row in f_csv:
... print(row)
...
['bdsa_growth_track', ' stat_dt', ' 时间']
['bdsa_growth_track', ' cust_mng_emp_id', ' 客户经理工号']
['bdsa_growth_track', ' cust_mng_emp_nm', ' 客户经理姓名']
如果我们的目标是读取csv数据来进行数据分析和统计,那么应该看看Pandas这个Python包,Pandas中有一个方便的函数pandas.read_csv(),能够将csv数据加载到DataFrame对象中,之后便可以生成各种各样的统计摘要了,还可以对数据进行筛选并执行其他类型的高级操作;
2.读取json数据
解决方案:json模块中提供了一种简单的方法来编码和解码JSON个数的数据,这两个主要的函数是json.dumps()和json.loads()。这两个函数在命名上借鉴了其他序列化处理库的接口,比如pickle。
如果要同文件而不是字符串打交道的话,可以选择使用json.dump()以及json.load()来编码和解码JSON数据;
>>> json.dumps(False)
'false'
>>> d = {'a':True,'b':False,'c':None}
>>> json.dumps(d)
'{"a": true, "b": false, "c": null}'
如果要检查从JSON中解码的得到的数据,那么斤斤将其打印出来就想确定数据的结果通常是比较困难的--尤其是如果数据中包含可深层次的嵌套结果或者有许多字段时,为了帮助解决这个问题,考虑使用pprint模块中的pprint()函数;
>>>from urllib.request import urlopen
>>>import json
>>>u = urlopen('http://search.twitter.com/search.json/q=python&rpp=5')
>>>resp = json.load(u.read().decode('utf-8'))
>>>from pprint import pprint
>>>pprint(resp)
一般情况下,JSON解码是会从所提供的数据中创建出字典或者列表,如果想创建其他类型的对象,可以为json.loads()提供object_pairs_hook或者object_hook参数。例如我们需要将JSON数据解码为(OrderedDict)有序字典
>>> s = '{"name":"overad","shares":50,"price":490.1}'
>>> from collections import OrderedDict
>>> data = json.loads(s,object_pairs_hook = OrderedDict)
>>> data
OrderedDict([('name', 'overad'), ('shares', 50), ('price', 490.1)])
可以将JSON字典转换为Python对象
>>> class JSONObject:
... def __init__(self,d):
... self.__dict__ = d
...
>>> data = json.loads(s,object_hook = JSONObject)
>>> data.name
'overad'
>>> data.shares
50
有几个选项对于编码JSON来说是很有用的,如果想让输出格式变得漂亮一些,可以在json.dumps()函数中使用indent参数。这个会使得数据能够像pprint()函数那样以漂亮的格式打印出来
>>> print(json.dumps(s,indent=4))
如果想在输出中对键进行排序处理,可以使用sort_keys
参数
>>> print(json.dumps(s,sort_keys = True))
3.解析简单的XML文档
解决方案:xml.etree.ElementTree模块可以用来从简单的XML文档中提取出数据,
为了说明,假设想对Planet Python上的订阅RSS做解析并生成一个总结报告。
>>> from urllib.request import urlopen
>>> from xml.etree.ElementTree import parse
>>> u = urlopen('http://planet.python.org/rss20.xml')
>>> doc = parse(u)
>>> for item in doc.iterfind('channel/item'):
... title = item.findtext('title')
... date = item.findtext('pubDate')
... link = item.findtext('link')
... print(title)
... print(date)
... print(link)
... print()
...
Trey Hunner: Multiple assignment and tuple unpacking improve Python code readability
Thu, 08 Mar 2018 00:30:00 +0000
http://treyhunner.com/2018/03/tuple-unpacking-improves-python-code-readability/
Mauveweb: Pyweek Game Jam, Episode 25
Thu, 08 Mar 2018 00:27:53 +0000
http://mauveweb.co.uk/posts/2018/03/pyweek-25.html
xml.etree.ElementTree.parse()
函数将整个XML文档解析为一个文档对象。之后就可以利用find(),iterfind()和findtext()方法
查询特定XML元素,这些函数的参数就是特定的标签名称;
每个由ElementTree模块所表示的元素都有一些重要的属性和方法,他们对解析操作十分有用,tag属性包含了标签的名称,text属性中包含有附着的文本,而get()方法可以用来提取出属性,
>>> doc
>>> e = doc.find('channel/title')
>>> e
>>> e.tag
'title'
>>> e.text
'Planet Python'
>>> e.get('title')
应该指出的是,xml.etree.ElementTree并不是解析XML的唯一选择,对于更加高级的应用,应该考虑使用lxml,lxml采用的编程接口和ElementTree一样,导入语句为,from lxml.etree import parse
;
4.以增量方式解析大型XML文档
解决方案:任何情况下,当要面对以增量方式来处理数据的问题时,都应该考虑使用迭代器和生成器。
from xml.etree.ElementTree import iterparse
5.将字典解析为XML
尽管xml.etree.ElementTree库通常用来解析XML文档,但他同时也可以用来创建XML文档,
>>> from xml.etree.ElementTree import Element
>>> def dict_to_xml(tag,d):
... elem = Element(tag)
... for key,val in d.items():
... child = Element(key)
... child.text = str(val)
... elem.append(child)
... return elem
...
>>> s = {'name':'overad','shares':100,'price':490.1}
>>> e = dict_to_xml('stock',s)
>>> e
>>> from xml.etree.ElementTree import tostring
>>> tostring(e)
b'overad 100 490.1 '
如果想为元素附加上属性,可以使用set()方法实现;
>>> e.set('_id','12345')
>>> tostring(e)
b'overad 100 490.1 '
6.解析、修改和重写XML
解决方案:修改XML文档的结果是简单直接的,但是必须记住所有的修改主要是对父元素进行的,我们把他当做一个列表一样对待。比如要移除某个元素,那么久利用它的直接父节点的remove()方法完成。如果要插入或添加新元素,统一要使用父节点的insert()和append()方法来完成。这些元素也可以使用索引和切片来进行操作,比如element[i]或者是element[i:j]
7.用命名空间来解析XML文档
8.同关系型数据库进行交互
9.编码和解码十六进制数字
10.Base64编码和解码
11.读写二进制结构的数组
12.读取嵌套和大小可变的二进制结构
13.数据汇总和统计
解决方案:Pandas