分析Python中解析构建数据知识


Posted in Python onJanuary 20, 2018

Python 可以通过各种库去解析我们常见的数据。其中 csv 文件以纯文本形式存储表格数据,以某字符作为分隔值,通常为逗号;xml 可拓展标记语言,很像超文本标记语言 Html ,但主要对文档和数据进行结构化处理,被用来传输数据;json 作为一种轻量级数据交换格式,比 xml 更小巧但描述能力却不差,其本质是特定格式的字符串;Microsoft Excel 是电子表格,可进行各种数据的处理、统计分析和辅助决策操作,其数据格式为 xls、xlsx。接下来主要介绍通过 Python 简单解析构建上述数据,完成数据的“珍珠翡翠白玉汤”。

Python 解析构建 csv

通过标准库中的 csv 模块,使用函数 reader()、writer() 完成 csv 数据基本读写。

import csv
with open('readtest.csv', newline='') as csvfile:
reader = csv.reader(csvfile)
for row in reader:
print(row)
with open('writetest.csv', 'w', newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerrow("onetest")
writer.writerows("someiterable")

其中 reader() 返回迭代器, writer() 通过 writerrow() 或 writerrows() 写入一行或多行数据。两者还可通过参数 dialect 指定编码方式,默认以 excel 方式,即以逗号分隔,通过参数 delimiter 指定分隔字段的单字符,默认为逗号。

在 Python3 中,打开文件对象 csvfile ,需要通过 newline='' 指定换行处理,这样读取文件时,新行才能被正确地解释;而在 Python2 中,文件对象 csvfile 必须以二进制的方式 'b' 读写,否则会将某些字节(0x1A)读写为文档结束符(EOF),导致文档读取不全。

除此之外,还可使用 csv 模块中的类 DictReader()、DictWriter() 进行字典方式读写。

import csv
with open('readtest.csv', newline='') as csvfile:
  reader = csv.DictReader(csvfile)
  for row in reader:
    print(row['first_test'], row['last_test'])
with open('writetest.csv', 'w', newline='') as csvfile:
  fieldnames = ['first_test', 'last_test']
  writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
  writer.writeheader()
  writer.writerow({'first_test': 'hello', 'last_test': 'wrold'})
  writer.writerow({'first_test': 'Hello', 'last_test': 'World'})
  #writer.writerows([{'first_test': 'hello', 'last_test': 'wrold'}, {'first_test': 'Hello', 'last_test': 'World'}])

其中 DictReader() 返回有序字典,使得数据可通过字典的形式访问,键名由参数 fieldnames 指定,默认为读取的第一行。

DictWriter() 必须指定参数 fieldnames 说明键名,通过 writeheader() 将键名写入,通过 writerrow() 或 writerrows() 写入一行或多行字典数据。

Python 解析构建 xml

通过标准库中的 xml.etree.ElementTree 模块,使用 Element、ElementTree 完成 xml 数据的读写。

from xml.etree.ElementTree import Element, ElementTree
root = Element('language')
root.set('name', 'python')
direction1 = Element('direction')
direction2 = Element('direction')
direction3 = Element('direction')
direction4 = Element('direction')
direction1.text = 'Web'
direction2.text = 'Spider'
direction3.text = 'BigData'
direction4.text = 'AI'
root.append(direction1)
root.append(direction2)
root.append(direction3)
root.append(direction4)
#import itertools
#root.extend(chain(direction1, direction2, direction3, direction4))
tree = ElementTree(root)
tree.write('xmltest.xml')

写 xml 文件时,通过 Element() 构建节点,set() 设置属性和相应值,append() 添加子节点,extend() 结合循环器中的 chain() 合成列表添加一组节点,text 属性设置文本值,ElementTree() 传入根节点构建树,write() 写入 xml 文件。

import xml.etree.ElementTree as ET
tree = ET.parse('xmltest.xml')
#from xml.etree.ElementTree import ElementTree
#tree = ElementTree().parse('xmltest.xml')
root = tree.getroot()
tag = root.tag
attrib = root.attrib
text = root.text
direction1 = root.find('direction')
direction2 = root[1]
directions = root.findall('.//direction')
for direction in root.findall('direction'):
  print(direction.text)
for direction in root.iter('direction'):
  print(direction.text)
root.remove(direction2)

读 xml 文件时,通过 ElementTree() 构建空树,parse() 读入 xml 文件,解析映射到空树;getroot() 获取根节点,通过下标可访问相应的节点;tag 获取节点名,attrib 获取节点属性字典,text 获取节点文本;find() 返回匹配到节点名的第一个节点,findall() 返回匹配到节点名的所有节点,find()、findall() 两者都仅限当前节点的一级子节点,都支持 xpath 路径提取节点;iter() 创建树迭代器,遍历当前节点的所有子节点,返回匹配到节点名的所有节点;remove() 移除相应的节点。

除此之外,还可通过 xml.sax、xml.dom.minidom 去解析构建 xml 数据。其中 sax 是基于事件处理的;dom 是将 xml 数据在内存中解析成一个树,通过对树的操作来操作 xml;而 ElementTree 是轻量级的 dom ,具有简单而高效的API,可用性好,速度快,消耗内存少,但生成的数据格式不美观,需要手动格式化。

Python 解析构建 json

通过标准库中的 json 模块,使用函数 dumps()、loads() 完成 json 数据基本读写。

>>> import json
>>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
'["foo", {"bar": ["baz", null, 1.0, 2]}]'
>>> json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
['foo', {'bar': ['baz', None, 1.0, 2]}]

json.dumps() 是将 obj 序列化为 json 格式的 str,而 json.loads() 是反向操作。其中 dumps() 可通过参数 ensure_ascii 指定是否使用 ascii 编码,默认为 True;通过参数  separators=(',', ':') 指定 json 数据格式中的两种分隔符;通过参数 sort_keys 指定是否使用排序,默认为 False。

除此之外,还可使用 json 模块中的函数 dump()、load() 进行 json 数据读写。

import json
with open('jsontest.json', 'w') as jsonfile:
json.dump(['foo', {'bar': ('baz', None, 1.0, 2)}], jsonfile)
with open('jsontest.json') as jsonfile:
json.load(jsonfile)

功能与 dumps()、loads() 相同,但接口不同,需要与文件操作结合,多传入一个文件对象。

Python 解析构建 excel

通过 pip 安装第三方库 xlwt、xlrd 模块,完成 excel 数据的读写。

import xlwt
wbook = xlwt.Workbook(encoding='utf-8')
wsheet = wbook.add_sheet('sheet1')
wsheet.write(0, 0, 'Hello World')
wbook.save('exceltest.xls')

写 excel 数据时,通过 xlwt.Workbook() 指定编码格式参数 encoding 创建工作表,add_sheet() 添加表单,write() 在相应的行列单元格中写入数据,save() 保存工作表。

import xlrd
rbook = xlrd.open_workbook('exceltest.xls')
rsheet = book.sheets()[0]
#rsheet = book.sheet_by_index(0)
#rsheet = book.sheet_by_name('sheet1')
nr = rsheet.nrows
nc = rsheet.ncols
rv = rsheet.row_values(0)
cv = rsheet.col_values(0)
cell = rsheet.cell_value(0, 0)

读 excel 数据时,通过 xlrd.open_workbook() 打开相应的工作表,可使用列表下标、表索引 sheet_by_index()、表单名 sheet_by_name() 三种方式获取表单名,nrows 获取行数,ncols 获取列数,row_values() 返回相应行的值列表,col_values() 返回相应列的值列表,cell_value() 返回相应行列的单元格值。

Python 相关文章推荐
Python yield使用方法示例
Dec 04 Python
Python版微信红包分配算法
May 04 Python
Python的装饰器使用详解
Jun 26 Python
linecache模块加载和缓存文件内容详解
Jan 11 Python
python如何爬取个性签名
Jun 19 Python
python 字符串和整数的转换方法
Jun 25 Python
Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
Jul 31 Python
使用matlab或python将txt文件转为excel表格
Nov 01 Python
Python包,__init__.py功能与用法分析
Jan 07 Python
Python线程条件变量Condition原理解析
Jan 20 Python
Pycharm安装并配置jupyter notebook的实现
May 18 Python
Python中Selenium对Cookie的操作方法
Jul 09 Python
学习Python selenium自动化网页抓取器
Jan 20 #Python
python使用pil库实现图片合成实例代码
Jan 20 #Python
python方向键控制上下左右代码
Jan 20 #Python
Python线程创建和终止实例代码
Jan 20 #Python
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
Jan 20 #Python
Python实现PS滤镜的旋转模糊功能示例
Jan 20 #Python
浅谈flask中的before_request与after_request
Jan 20 #Python
You might like
PHP中的reflection反射机制测试例子
2014/08/05 PHP
比较完整的微信开发php代码
2016/08/02 PHP
PDO::inTransaction讲解
2019/01/28 PHP
Smarty模板变量与调节器实例详解
2019/07/20 PHP
PHP7 标准库修改
2021/03/09 PHP
火狐4、谷歌12不支持Jquery Validator的解决方法分享
2011/06/20 Javascript
JQuery slideshow的一个小问题(如何发现及解决过程)
2013/02/06 Javascript
javascript 树形导航菜单实例代码
2013/08/13 Javascript
JS验证邮箱格式是否正确的代码
2013/12/05 Javascript
javascript框架设计读书笔记之数组的扩展与修复
2014/12/02 Javascript
javaScript中slice函数用法实例分析
2015/06/08 Javascript
jQuery时间轴插件使用详解
2015/07/16 Javascript
javascript iframe跨域详解
2016/10/26 Javascript
利用Javascript裁剪图片并存储的简单实现
2017/03/13 Javascript
解决vue2.0路由跳转未匹配相应用路由避免出现空白页面的问题
2018/08/24 Javascript
JavaScript定时器使用方法详解
2020/03/26 Javascript
如何用JS模拟实现数组的map方法
2020/07/30 Javascript
JavaScript实现多文件下载方法解析
2020/08/07 Javascript
Python去除列表中重复元素的方法
2015/03/20 Python
Python操作MongoDB数据库PyMongo库使用方法
2015/04/27 Python
Python实现调度算法代码详解
2017/12/01 Python
Python+matplotlib实现填充螺旋实例
2018/01/15 Python
Python使用遗传算法解决最大流问题
2018/01/29 Python
Python3.6使用tesseract-ocr的正确方法
2018/10/17 Python
python matplotlib库直方图绘制详解
2019/08/10 Python
python接口调用已训练好的caffe模型测试分类方法
2019/08/26 Python
tensorflow实现测试时读取任意指定的check point的网络参数
2020/01/21 Python
python 伯努利分布详解
2020/02/25 Python
Subside Sports德国:足球球衣和球迷商品
2019/06/08 全球购物
Viking比利时:购买办公用品
2019/10/30 全球购物
会计辞职信范文
2014/01/15 职场文书
公司周年庆活动方案
2014/08/25 职场文书
党的群众路线教育实践活动对照检查材料范文
2014/09/24 职场文书
2015年护理工作总结范文
2015/04/03 职场文书
爱国主题班会教案
2015/08/14 职场文书
大学社团活动总结怎么写
2019/06/21 职场文书