第六章:数据编码与处理

本章的重点是利用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
<xml.etree.ElementTree.ElementTree object at 0x0000000003C0CA58>
>>> e = doc.find('channel/title')
>>> e
<Element 'title' at 0x0000000003F86C28>
>>> 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
<Element 'stock' at 0x000000000A8D8E58>
>>> from xml.etree.ElementTree import tostring
>>> tostring(e)
b'<stock><name>overad</name><shares>100</shares><price>490.1</price></stock>'

如果想为元素附加上属性,可以使用set()方法实现;

>>> e.set('_id','12345')
>>> tostring(e)
b'<stock _id="12345"><name>overad</name><shares>100</shares><price>490.1</price></stock>'

6.解析、修改和重写XML

解决方案:修改XML文档的结果是简单直接的,但是必须记住所有的修改主要是对父元素进行的,我们把他当做一个列表一样对待。比如要移除某个元素,那么久利用它的直接父节点的remove()方法完成。如果要插入或添加新元素,统一要使用父节点的insert()和append()方法来完成。这些元素也可以使用索引和切片来进行操作,比如element[i]或者是element[i:j]

7.用命名空间来解析XML文档

8.同关系型数据库进行交互

9.编码和解码十六进制数字

10.Base64编码和解码

11.读写二进制结构的数组

12.读取嵌套和大小可变的二进制结构

13.数据汇总和统计

解决方案:Pandas

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容