python读取第⼆⾏_使⽤Python操作Excel(⼆):读取数据表上⼀节我们提到,使⽤openpyxl可以⽅便的对数据表进⾏操作,例如:抽象Excel数据并存⼊数据库
将数据库数据导出到Excel
标准ascii码表有多少个字符编码给⼀个已存在的数据表追加信息
我们还介绍了⼀些Excel的基本术语,在⾃⼰本地安装了openpyxl库并⽤库在本地创建了简单的Excel⽂件。
本节的主要内容是使⽤openpyxl来读取Excel表,你将掌握阅读数据表的⽅法,阅读从简单到复杂的各种例⼦,并将他们转化成Python内更有⽤的数据类型。让我们开始这⼀最重要的操作吧!
本节所涉及的数据集:Dataset for openpyxl Tutorial – Real Python r ealpython
本数据集来⾃亚马逊在线商品评论的真实数据,这只是Amazon商品的⼀⼩部分,但对于我们学习来说也⾜够了
请下载本数据集并存为“sample.xlsx”
简单阅读Excel表格的Python代码
在上⾯的代码中:⾸先⽤ load_workbook ⽅法打开了名为sample.xlsx的数据表,然后就可以使⽤workbook.sheetnames来查看所有你可⽤的sheet
workbook.active ⽅法选择了第⼀个可⽤的sheet
使⽤该⽅法是默认的打开电⼦表的⽅法,在该教程中你会看到很多次
打开数据表之后,我们可以很容易的检索数据表:
为了返回这个单元的具体数值,你需要使⽤.value,否则你得到的就会是这个对象。你也可以使⽤.cell() 通过指针符号检索数据,如下:
记住,要得到单元格的具体值⽽⾮单元格这个对象,就要使⽤.value来取值
你可以看到,不管你选⽤上述哪种⽅式定位单元格并取值,得到的结果相同。在本课程中,我们更多使⽤第⼀种:["A1"]来定位单元格
注意,即使你在Python中使⽤ 0 索引表⽰法,但在数据表中,你需要使⽤ 1 索引法,(也就是说在Python中索引从0开始,但使⽤openpyxl时索引从1开始)
上述讨论了打开数据表最快的⽅法。然⽽,你可以通过传递其他参数来改变数据表的加载⽅式。加载⽅式如下所⽰。
其他的加载选项
在调⽤load_workbook() 时,你可以传递⼀些参数来改变数据表的加载⽅式。最重要的是如下两种:read_only:只读模式允许你打开⾮常⼤的Excel⽂件来加载数据表
data_only:仅加载数据模式忽略加载公式,⽽只是加载结果数据
从数据表导⼊数据
现在你已经学习了加载数据表的基础,是时候进⼊有趣的环节了:迭代、在数据表中正式使⽤数值。在这部分,你将会学到所有你可能会⽤到的遍历数据⽅式,同时也会学到如何通过转换使得数据更加有⽤,当然,是以我们Pythonic⽅式啦。
遍历数据
根据不同的需求,有很多种不同的⽅法转换数据。你可以⾏列结合来切分数据:
你可以得到⾏或列的范围:图没有截全,包含了这张表所有A列的数据
仍然没截全,这次依次提取了A,B两列的数据,先A后B返回第五⾏的数据返回第五⾏和第六⾏的数据
你会注意到所有上述所有例⼦都返回 tuple,如果你想回忆Python如何操作list和tuple的话,请看这篇⽂章:Lists and Tuples in Python
– Real Python r ealpython
还有多种使⽤Python⽣成器来浏览数据的⽅法,你能⽤于实现的主要有:.iter_rows()
.iter_cols()
新数据库sqllite这两个⽅法都可以接收如下⽤于设置迭代的边界的参数:min_row
max_row
min_col
max_col
⽰例如下:按⾏打印按列打印
你可能注意到了:在使⽤.iter_rows() 时,你每⾏得到⼀个选中的元组,⽽当你使⽤.iter_cols()时,你每列得到⼀个元组。
在上述的两个⽅法之中你都可以传递布尔值“values_only”,当该值被设置为True时,单元格的值⽽⾮单元格对象本⾝被返回:只传回值
如果你想遍历整个数据集,那么你可以直接使⽤.rows,.columns等属性,这些属性是.iter_rows() 和.it
er_cols() ⽆参数时的特例。按⾏
输出整个电⼦表
使⽤Python内部数据结构操作数据集:
现在你了解了遍历电⼦表格的数据的基础,让我们来看看如何将电⼦表的数据转换到Python的聪明⽅式吧!
正如你之前所看到的,通过迭代得到的结果都保存在元组中,然⽽,元组也不过是个不可变的列表,所以你可以轻松的获得元组数据并将它们转换为其他结构的数据。
例如,假设你想把sample.xlsx 中的数据抽象出产品信息并放进⼀个以产品id为key的dict,最直接的⽅法是遍历所有的⾏,挑选出你知道的与产品信息有关的列,然后将其存在字典⾥。让我们试试看!
第⼀步:查看表头,看看你最关⼼的有什么信息该代码返回了表格中所有的列名
⾸先,提取出如下列:product_id
product_parent
product_title
product_category
很幸运的是,我们想要的数据都挨在⼀起,你可以使⽤min_col和max_col来很容易得到你想要的信息:打印出想要的数据
⾮常好,你现在已经知道如何得到你需要的重要的产品信息了!现在我们把它放进字典中:
import json
from openpyxl import load_workbook
workbook = load_workbook(filename="sample.xlsx")
sheet = workbook.active
products = {}
# 使⽤values_only返回单元格的值
for row in sheet.iter_rows(min_row=2,
min_col=4,
max_col=7,
python基础代码大全下载values_only=True):
product_id = row[0]
product = {
"parent": row[1],
"title": row[2],
"category": row[3]
}
products[product_id] = product
print(json.dumps(products))
这段代码将表格中除了第⼆⾏的每⼀⾏,4-7列的每⼀列打印出来,如图所⽰:我在这⾥使⽤了pprint做整齐的字典打印, ⼀共98个
将数据转换到Python类中
为了完成本课程对Excel的读取部分,我们现在要深⼊到Python类中,看看你能在上⾯的案例的基础上如何提升并对数据进⾏更好的结构化。
关于数据类的教程我们将在其他专栏中专门介绍,为了完成上述⽬的,你应该使⽤从Python3.7开始⽀持的数据类。如果你使⽤⽼版本的Python,你可以使⽤默认的类来替代。
在⼀切开始之前,让我们看看你有什么数据,并且决定你想保存哪些,怎么保存吧。
从数据中,有如下两个明显元素你可以从中提取:Product
Reviews
每个产品有:ID
Title
Parent
Category
评论有如下字段:ID
Customer ID
Stars
Headline
我要自学网appBody
Date
import datetime
from dataclasses import dataclass
@dataclass
class Product:
id: str
parent: str
title: str
category: str
@dataclass
class Review:
id: str
customer_id: str
stars: int
headline: str
date: datetime.datetime
在定义你的数据类型之后,你需要将数据表中的数据转换到这些新的数据结构中。
在做这个转换之前,我们应该再次查看数据头,在列和字段之间创建映射关系:第⼀种遍历法第⼆种遍历法让我们创建⼀个⽂件mapping.py,在这个⽂件中包含所有字段名和他们的列的位置的列表。
你并不⼀定要执⾏上⾯的映射,但解析⾏数据时这样做更具有可读性,这样的话在执⾏结束后不会有⼀堆看起来奇怪的数字。最后,让我们看看解析单元表数据到⼀个包含很多产品和评论的对象的列表需要哪些代码:
from datetime import datetime
from openpyxl import load_workbook
from classes import Product, Review
from mapping import PRODUCT_CATEGORY, PRODUCT_ID, PRODUCT_PARENT, PRODUCT_TITLE, \
REVIEW_DATE, REVIEW_STARS, REVIEW_ID, REVIEW_BODY, REVIEW_HEADLINE, REVIEW_CUSTOMER
# Using the read_only method since we are not gonna be editing the spreadsheet
workbook = load_workbook(filename="sample.xlsx", read_only=True)
sheet = workbook.active
products = []
reviews = []
# Using the values_only for we just want to return the cell value
for row in sheet.iter_rows(min_row=2, values_only=True):
product = Product(
id=row[PRODUCT_ID],
parent=row[PRODUCT_PARENT],
title=row[PRODUCT_TITLE],css左右居中怎么设置
category=row[PRODUCT_CATEGORY]
)
products.append(product)
# we need to parse the data from the spreadsheet into a datetime formatfreemarker标签
spread_date = row[REVIEW_DATE]
parsed_date = datetime.strptime(spread_date, "%Y-%m-%d")
review = Review(
id=row[REVIEW_ID],
customer_id=row[REVIEW_CUSTOMER],
stars=row[REVIEW_STARS],
headline=row[REVIEW_BODY],
date=parsed_date
)
reviews.append(review)
print(products[0])
print(reviews[0])
运⾏该代码后,得到如下输出:
这就对了! 现在你得到了如此简单易懂的类形式的数据,你可以开始考虑将他们存在数据库⾥,或者任何别的类型的形式了!使⽤这种⾯向对象的策略来解析数据表使得以后处理数据如此简单!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论