python读取第二行_使用Python操作Excel(二):读取数据表
上一節(jié)我們提到,使用openpyxl可以方便的對數(shù)據(jù)表進(jìn)行操作,例如:抽象Excel數(shù)據(jù)并存入數(shù)據(jù)庫
將數(shù)據(jù)庫數(shù)據(jù)導(dǎo)出到Excel
給一個(gè)已存在的數(shù)據(jù)表追加信息
我們還介紹了一些Excel的基本術(shù)語,在自己本地安裝了openpyxl庫并用庫在本地創(chuàng)建了簡單的Excel文件。
本節(jié)的主要內(nèi)容是使用openpyxl來讀取Excel表,你將掌握閱讀數(shù)據(jù)表的方法,閱讀從簡單到復(fù)雜的各種例子,并將他們轉(zhuǎn)化成Python內(nèi)更有用的數(shù)據(jù)類型。讓我們開始這一最重要的操作吧!
本節(jié)所涉及的數(shù)據(jù)集:Dataset for openpyxl Tutorial – Real Python?realpython.com
本數(shù)據(jù)集來自亞馬遜在線商品評論的真實(shí)數(shù)據(jù),這只是Amazon商品的一小部分,但對于我們學(xué)習(xí)來說也足夠了
請下載本數(shù)據(jù)集并存為“sample.xlsx”
簡單閱讀Excel表格的Python代碼
在上面的代碼中:首先用 load_workbook 方法打開了名為sample.xlsx的數(shù)據(jù)表,然后就可以使用workbook.sheetnames來查看所有你可用的sheet
workbook.active 方法選擇了第一個(gè)可用的sheet
使用該方法是默認(rèn)的打開電子表的方法,在該教程中你會看到很多次
打開數(shù)據(jù)表之后,我們可以很容易的檢索數(shù)據(jù)表:
為了返回這個(gè)單元的具體數(shù)值,你需要使用.value,否則你得到的就會是這個(gè)對象。你也可以使用.cell() 通過指針符號檢索數(shù)據(jù),如下:
記住,要得到單元格的具體值而非單元格這個(gè)對象,就要使用.value來取值
你可以看到,不管你選用上述哪種方式定位單元格并取值,得到的結(jié)果相同。在本課程中,我們更多使用第一種:["A1"]來定位單元格
注意,即使你在Python中使用 0 索引表示法,但在數(shù)據(jù)表中,你需要使用 1 索引法,(也就是說在Python中索引從0開始,但使用openpyxl時(shí)索引從1開始)
上述討論了打開數(shù)據(jù)表最快的方法。然而,你可以通過傳遞其他參數(shù)來改變數(shù)據(jù)表的加載方式。加載方式如下所示。
其他的加載選項(xiàng)
在調(diào)用load_workbook() 時(shí),你可以傳遞一些參數(shù)來改變數(shù)據(jù)表的加載方式。最重要的是如下兩種:read_only:只讀模式允許你打開非常大的Excel文件來加載數(shù)據(jù)表
data_only:僅加載數(shù)據(jù)模式忽略加載公式,而只是加載結(jié)果數(shù)據(jù)
從數(shù)據(jù)表導(dǎo)入數(shù)據(jù)
現(xiàn)在你已經(jīng)學(xué)習(xí)了加載數(shù)據(jù)表的基礎(chǔ),是時(shí)候進(jìn)入有趣的環(huán)節(jié)了:迭代、在數(shù)據(jù)表中正式使用數(shù)值。在這部分,你將會學(xué)到所有你可能會用到的遍歷數(shù)據(jù)方式,同時(shí)也會學(xué)到如何通過轉(zhuǎn)換使得數(shù)據(jù)更加有用,當(dāng)然,是以我們Pythonic方式啦。
遍歷數(shù)據(jù)
根據(jù)不同的需求,有很多種不同的方法轉(zhuǎn)換數(shù)據(jù)。你可以行列結(jié)合來切分?jǐn)?shù)據(jù):
你可以得到行或列的范圍:圖沒有截全,包含了這張表所有A列的數(shù)據(jù)
仍然沒截全,這次依次提取了A,B兩列的數(shù)據(jù),先A后B返回第五行的數(shù)據(jù)返回第五行和第六行的數(shù)據(jù)
你會注意到所有上述所有例子都返回 tuple,如果你想回憶Python如何操作list和tuple的話,請看這篇文章:Lists and Tuples in Python – Real Python?realpython.com
還有多種使用Python生成器來瀏覽數(shù)據(jù)的方法,你能用于實(shí)現(xiàn)的主要有:.iter_rows()
.iter_cols()
這兩個(gè)方法都可以接收如下用于設(shè)置迭代的邊界的參數(shù):min_row
max_row
min_col
max_col
示例如下:按行打印按列打印
你可能注意到了:在使用.iter_rows() 時(shí),你每行得到一個(gè)選中的元組,而當(dāng)你使用.iter_cols()時(shí),你每列得到一個(gè)元組。
在上述的兩個(gè)方法之中你都可以傳遞布爾值“values_only”,當(dāng)該值被設(shè)置為True時(shí),單元格的值而非單元格對象本身被返回:只傳回值
如果你想遍歷整個(gè)數(shù)據(jù)集,那么你可以直接使用.rows,.columns等屬性,這些屬性是.iter_rows() 和.iter_cols() 無參數(shù)時(shí)的特例。按行輸出整個(gè)電子表
使用Python內(nèi)部數(shù)據(jù)結(jié)構(gòu)操作數(shù)據(jù)集:
現(xiàn)在你了解了遍歷電子表格的數(shù)據(jù)的基礎(chǔ),讓我們來看看如何將電子表的數(shù)據(jù)轉(zhuǎn)換到Python的聰明方式吧!
正如你之前所看到的,通過迭代得到的結(jié)果都保存在元組中,然而,元組也不過是個(gè)不可變的列表,所以你可以輕松的獲得元組數(shù)據(jù)并將它們轉(zhuǎn)換為其他結(jié)構(gòu)的數(shù)據(jù)。
例如,假設(shè)你想把sample.xlsx 中的數(shù)據(jù)抽象出產(chǎn)品信息并放進(jìn)一個(gè)以產(chǎn)品id為key的dict,最直接的方法是遍歷所有的行,挑選出你知道的與產(chǎn)品信息有關(guān)的列,然后將其存在字典里。讓我們試試看!
第一步:查看表頭,看看你最關(guān)心的有什么信息該代碼返回了表格中所有的列名
首先,提取出如下列:product_id
product_parent
product_title
product_category
很幸運(yùn)的是,我們想要的數(shù)據(jù)都挨在一起,你可以使用min_col和max_col來很容易得到你想要的信息:打印出想要的數(shù)據(jù)
非常好,你現(xiàn)在已經(jīng)知道如何得到你需要的重要的產(chǎn)品信息了!現(xiàn)在我們把它放進(jìn)字典中:
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,
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個(gè)
將數(shù)據(jù)轉(zhuǎn)換到Python類中
為了完成本課程對Excel的讀取部分,我們現(xiàn)在要深入到Python類中,看看你能在上面的案例的基礎(chǔ)上如何提升并對數(shù)據(jù)進(jìn)行更好的結(jié)構(gòu)化。
關(guān)于數(shù)據(jù)類的教程我們將在其他專欄中專門介紹,為了完成上述目的,你應(yīng)該使用從Python3.7開始支持的數(shù)據(jù)類。如果你使用老版本的Python,你可以使用默認(rèn)的類來替代。
在一切開始之前,讓我們看看你有什么數(shù)據(jù),并且決定你想保存哪些,怎么保存吧。
正如你在開始看到的,這些數(shù)據(jù)來源于亞馬遜的商品評論列表,你可以在如下鏈接查看這些數(shù)據(jù)的所有屬性及其含義:https://s3.amazonaws.com/amazon-reviews-pds/tsv/index.txt?s3.amazonaws.com
從數(shù)據(jù)中,有如下兩個(gè)明顯元素你可以從中提取:Product
Reviews
每個(gè)產(chǎn)品有:ID
Title
Parent
Category
評論有如下字段:ID
Customer ID
Stars
Headline
Body
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
在定義你的數(shù)據(jù)類型之后,你需要將數(shù)據(jù)表中的數(shù)據(jù)轉(zhuǎn)換到這些新的數(shù)據(jù)結(jié)構(gòu)中。
在做這個(gè)轉(zhuǎn)換之前,我們應(yīng)該再次查看數(shù)據(jù)頭,在列和字段之間創(chuàng)建映射關(guān)系:第一種遍歷法第二種遍歷法
讓我們創(chuàng)建一個(gè)文件mapping.py,在這個(gè)文件中包含所有字段名和他們的列的位置的列表。
你并不一定要執(zhí)行上面的映射,但解析行數(shù)據(jù)時(shí)這樣做更具有可讀性,這樣的話在執(zhí)行結(jié)束后不會有一堆看起來奇怪的數(shù)字。
最后,讓我們看看解析單元表數(shù)據(jù)到一個(gè)包含很多產(chǎn)品和評論的對象的列表需要哪些代碼:
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],
category=row[PRODUCT_CATEGORY]
)
products.append(product)
# we need to parse the data from the spreadsheet into a datetime format
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])
運(yùn)行該代碼后,得到如下輸出:
這就對了! 現(xiàn)在你得到了如此簡單易懂的類形式的數(shù)據(jù),你可以開始考慮將他們存在數(shù)據(jù)庫里,或者任何別的類型的形式了!
使用這種面向?qū)ο蟮牟呗詠斫馕鰯?shù)據(jù)表使得以后處理數(shù)據(jù)如此簡單!
總結(jié)
以上是生活随笔為你收集整理的python读取第二行_使用Python操作Excel(二):读取数据表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有没有python的班_【万字长文】别再
- 下一篇: python scrapy框架爬虫_Sc