写点什么

数据分析从零开始实战,Pandas 读写 Excel/XML 数据

作者:老表
  • 2021 年 11 月 28 日
  • 本文字数:2694 字

    阅读完需:约 9 分钟

数据分析从零开始实战,Pandas读写Excel/XML数据

这是我参与 11 月更文挑战的第 18 天。

零 写在前面

本系列学习笔记参考书籍:  《数据分析实战》托马兹·卓巴斯,会将自己学习本书的笔记分享给大家,同样开成一个系列『数据分析从零开始实战』。


点击查看第一篇文章:# 数据分析从零开始实战,Pandas读写CSV数据

点击查看第一篇文章:# 数据分析从零开始实战,Pandas读写TSV/Json数据


前面两篇文章讲了数据分析虚拟环境创建和 pandas 读写 csv、tsv、json 格式的数据,今天我们继续探索 pandas 读取数据。

一 基本知识概要

1.利用 pandas 读写 Excel 文件 2.利用 pandas 读写 XML 文件

二 开始动手动脑

1.利用 Python 读写 Excel

读取,利用 Pandas 库的 ExcelFile()方法。

写入,利用 Pandas 库的利用 to_excel 方法。

代码

import pandas as pdimport os
# 获取当前文件父目录路径father_path = os.getcwd()# 原始数据文件路径rpath_excel = father_path+r'\data01\realEstate_trans.xlsx'# 数据保存路径wpath_excel = father_path+r'\data01\temp_excel.xlsx'
# 打开excel文件excel_file = pd.ExcelFile(rpath_excel)
# 读取文件内容"""ExcelFile对象的parse()方法读取指定工作表的内容ExcelFile对象的sheet_names属性可以获取Excel文件中的所有工作表这里还用到了字典表达式来给字典赋值(看起来更加优雅)"""
excel_read = {sheetName : excel_file.parse(sheetName) for sheetName in excel_file.sheet_names}
# 输出Sacramento表格的price列的头10行记录print(excel_read['Sacramento'].head(10)['price'])print(type(excel_read['Sacramento'].head(10)['price']))# 遇到错误:ModuleNotFoundError: No module named 'xlrd'
# 写入表格的price列的前10行excel_read['Sacramento'].head(10)['price'].to_excel(wpath_excel, "price", index=False)# 遇到错误:ModuleNotFoundError: No module named 'openpyxl'
复制代码

读取结果:



写入结果:



可能报错:

读操作时:ModuleNotFoundError: No module named 'xlrd'写操作时:ModuleNotFoundError: No module named 'openpyxl'
复制代码

解决方法:

# 在环境里安装xlrd和openpyxl模块即可pip install xlrdpip install openpyxl
复制代码
2.利用 Python 读写 XML 文件

学过 java 的同学对 XML 应该不陌生,全称是 eXtensible Markup Language(扩展标记语言),虽然平时不常见,但是 Web API 里支持 XML 编码。

读写代码

import pandas as pd# 一个轻量的XML解析器import xml.etree.ElementTree as ETimport os
""" 读入XML数据,返回pa.DataFrame"""def read_xml(xml_FileName): with open(xml_FileName, "r") as xml_file: # 读取数据,以树的结构存储 tree = ET.parse(xml_file) # 访问树的梗节点 root = tree.getroot() # 返回DataFrame格式数据 return pd.DataFrame(list(iter_records(root)))
""" 遍历有记录的生成器"""def iter_records(records): for record in records : # 保存值的临时字典 temp_dict = {} # 遍历所有字段 for var in record: temp_dict[ var.attrib["var_name"] ] = var.text # 生成值 yield temp_dict
""" 以XML格式保存数据"""def write_xml(xmlFileName, data): with open(xmlFileName, "w") as xmlFile: # 写头部 xmlFile.write( '<?xml version="1.0" encoding="UTF-8"?>' ) xmlFile.write('<records>\n') # 写数据 xmlFile.write( '\n'.join(data.apply(xml_encode, axis=1)) ) # 写尾部 xmlFile.write("\n</records>")
""" 以特定的嵌套格式将每一行编码成XML"""def xml_encode(row): # 第一步--输出record节点 xmlItem = [' <record>'] # 第二步--给行中每个字段加上XML格式<field name=···>···</field> for field in row.index: xmlItem.append( '<var var_name="{0}">{1}</var>'.format(field, row[field]) ) # 最后一步--标记record节点的结束标签 xmlItem.append(" </record>") return '\n'.join(xmlItem)

# 获取当前文件父目录路径father_path = os.getcwd()# 原始数据文件路径rpath_xml = father_path+r'\data01\realEstate_trans.xml'# 数据保存路径wpath_xml = father_path+r'\data01\temp_xml.xml'# 读取数据xml_read = read_xml(rpath_xml)# 输出头10行记录print(xml_read.head(10))# 以XML格式写回文件write_xml(wpath_xml, xml_read.head(10))
复制代码

运行结果




代码解析

(1)read_xml(xml_FileName)函数

功能:读入 XML 数据,返回 pa.DataFrame

这里利用到了一个轻量级的 XML 解析器:xml.etree.ElementTree。传入文件名,先读取文件内容,然后利用 parse()函数解析 XML,创建一个树状结构并存放在 tree 变量中,在 tree 对象上调用 getroot()方法得到根节点,最后调用 iter_records()函数,传入根节点,进而将返回的信息转换成 DataFrame。


(2)iter_records(records)函数

功能:遍历有记录的生成器

iter_records()方法是一个生成器,从关键字yield可以看出来,与 return 不同,生成器每次只向主调方法返回一个值,直到结束。


(3)write_xml(xmlFile, data)函数

功能:以 XML 格式保存数据

这里需要注意的是得按 XML 文件格式进行保存,我们要做的就是三步:保存头部格式、按格式保存数据、保存尾部格式。保存数据时用到了 DataFrame 对象的 apply()方法,遍历内部每一行,第一个参数 xml_encode 指定了要应用到每一行记录上的方法,axis=1 表示按行处理,默认值为 0,表示按列处理。


(4)xml_encode(row)函数

功能:以特定的嵌套格式将每一行编码成 XML

在写数据的过程我们会调用这个方法,对每行数据进行处理,变成 XML 格式。

三 送你的话

昨天开了个会,然后思考了写问题,这里分享给大家:

1、思想觉悟,辩证思考。不要随声附和,要有己见,聪明的人应该是坚持输出自己的思想,从事情本身和和他人评论去思考,再辩正自己的思考,再输出;


2、少喊口号,多做实事。本来我是很推崇做个人规划的,但是,我发现不止是我周边和某些读者朋友,包括我自己,规划作的越来越假大空,规划本身没有错,错的是:现实生活中我们把规划变成了日日口号,而为能如实完成,所以我现在推崇:规划,先做再说。


坚持 and 努力 : 终有所获。

思想很复杂,

实现很有趣,

只要不放弃,

终有成名日。

—《老表打油诗》


下期见,我是爱猫爱技术的老表,如果觉得本文对你学习有所帮助,欢迎点赞、评论、关注我!

发布于: 23 小时前阅读数: 8
用户头像

老表

关注

公众号|简说Python 2018.09.23 加入

【公众号:简说Python】爱猫爱技术,Python终身学习者、数据分析爱好者、Go语言内卷机。

评论

发布
暂无评论
数据分析从零开始实战,Pandas读写Excel/XML数据