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