贵有恒,何必三更起、五更眠、最无益,只怕一日曝、十日寒。这篇文章主要讲述#yyds干货盘点#数据分析从零开始实战,Pandas读写Excel/XML数据相关的知识,希望能为你提供帮助。
这是我参与11月更文挑战的第16天。
零 写在前面
本系列学习笔记参考书籍:《数据分析实战》托马兹·卓巴斯,会将自己学习本书的笔记分享给大家,同样开成一个系列『数据分析从零开始实战』。
点击查看第一篇文章:# 数据分析从零开始实战,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 pd
import 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 xlrd
pip install openpyxl
2.利用Python读写XML文件学过java的同学对XML应该不陌生,全称是eXtensible Markup Language(扩展标记语言),虽然平时不常见,但是Web API里支持XML编码。
读写代码
import pandas as pd
# 一个轻量的XML解析器
import xml.etree.ElementTree as ET
import 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 努力 : 终有所获。
思想很复杂,
实现很有趣,
只要不放弃,
终有成名日。
—《老表打油诗》
【#yyds干货盘点#数据分析从零开始实战,Pandas读写Excel/XML数据】下期见,我是爱猫爱技术的老表,如果觉得本文对你学习有所帮助,欢迎点赞、评论、关注我!
推荐阅读
- #yyds干货盘点#PYTHON用LSTM长短期记忆神经网络的参数优化方法预测时间序列洗发水销售数据
- #yyds干货盘点#Spring专题「实战系列」Spring Security原理以及实战认证分析开发指南
- #yyds干货盘点# Spring嵌套事务是怎么回滚的()
- #yyds干货盘点#?并发技术系列「Web请求读取系列」如何构建一个可重复读取的Request的流机制
- LINUX:FTP服务
- #yyds干货盘点#Java ASM系列((097)生成Control Flow Graph)
- Linux的进程和计划任务管理
- #yyds干货盘点#Redis之Stream
- LINUX文件系统及日志分析