这是我参与 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 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 努力 : 终有所获。
思想很复杂,
实现很有趣,
只要不放弃,
终有成名日。
—《老表打油诗》
下期见,我是爱猫爱技术的老表,如果觉得本文对你学习有所帮助,欢迎点赞、评论、关注我!
评论