Python實(shí)現(xiàn)批量下載excel表中超鏈接圖片
背景
導(dǎo)出數(shù)據(jù)到excel,excel數(shù)據(jù)中有圖片鏈接,在excel中沒(méi)法直接看到圖片是什么樣的,需要批量下載圖片的指定文件夾,再進(jìn)行查看,想到了用python生成一個(gè)腳本文件做批量操作,試著寫一下。
數(shù)據(jù)格式

數(shù)據(jù)類型有文本,也有帶圖片鏈接的Json,存在多張圖片的情況,需要做的是批量獲取Json格式數(shù)據(jù)中的pic,并進(jìn)行下載
處理步驟
- 使用xlrd庫(kù)讀取Excel表格的數(shù)據(jù)
- 獲取Excel中的sheet,默認(rèn)取第一個(gè)sheet
- 遍歷sheet中的每一行數(shù)據(jù),判斷是文本還是Json格式數(shù)據(jù)
- 根據(jù)對(duì)應(yīng)的列,獲取Json中的pic鏈接地址,存到對(duì)應(yīng)的list中
- 使用requests庫(kù),取出list中的圖片地址進(jìn)行下載
- 確保文件夾存在,如果不存在則創(chuàng)建
1.xlrd庫(kù)簡(jiǎn)介
xlrd讀取excel表格數(shù)據(jù),支持xls和xlsx格式的excel表格
基本函數(shù)
1.xlrd.open_workbook(filename[, logfile, file_contents, ...]) 打開excel文件
- filename:需操作的文件名(包括文件路徑和文件名稱);
- 若filename不存在,則報(bào)錯(cuò)FileNotFoundError;
- 若filename存在,則返回值為xlrd.book.Book對(duì)象
2.BookObject.sheet_names() 獲取Book對(duì)象中所有sheet名稱,以列表方式顯示
3.BookObject.sheets():獲取所有sheet的對(duì)象,以列表形式顯示 BookObject.sheet_by_index(sheetx):通過(guò)sheet索引獲取所需sheet對(duì)象
- sheetx為索引值,索引從0開始計(jì)算;
- 若sheetx超出索引范圍,則報(bào)錯(cuò)IndexError;
- 若sheetx在索引范圍內(nèi),則返回值為xlrd.sheet.Sheet對(duì)象
4.BookObject.sheet_by_name(sheet_name):通過(guò)sheet名稱獲取所需sheet對(duì)象 - sheet_name為sheet名稱;- 若sheet_name不存在,則報(bào)錯(cuò)xlrd.biffh.XLRDError;- 若sheet_name存在,則返回值為xlrd.sheet.Sheet對(duì)象
5.對(duì)Sheet對(duì)象中的行操作
- SheetObject.nrows:獲取某sheet中的有效行數(shù)
- SheetObject.row_values(rowx[, start_colx=0, end_colx=None]):獲取sheet中第rowx+1行從start_colx列到end_colx列的數(shù)據(jù),返回值為列表。
- 若rowx在索引范圍內(nèi),以列表形式返回?cái)?shù)據(jù);
- 若rowx不在索引范圍內(nèi),則報(bào)錯(cuò)IndexError
- SheetObject.row(rowx):獲取sheet中第rowx+1行單元,返回值為列表;
- 列表每個(gè)值內(nèi)容為: 單元類型:單元數(shù)據(jù)
- SheetObject.row_slice(rowx[, start_colx=0, end_colx=None]):以切片方式獲取sheet中第rowx+1行從start_colx列到end_colx列的單元,返回值為列表;
- 列表每個(gè)值內(nèi)容為: 單元類型:單元數(shù)據(jù)
- SheetObject.row_types(rowx[, start_colx=0, end_colx=None]):獲取sheet中第rowx+1行從start_colx列到end_colx列的單元類型,返回值為array.array類型。
- 單元類型ctype:empty為0,string為1,number為2,date為3,boolean為4, error為5(左邊為類型,右邊為類型對(duì)應(yīng)的值);
- SheetObject.row_len(rowx):獲取sheet中第rowx+1行的長(zhǎng)度
- rowx:行標(biāo),行數(shù)從0開始計(jì)算(0表示第一行), 必填參數(shù);
- start_colx:起始列,表示從start_colx列開始取值,包括第start_colx的值;
- end_colx:結(jié)束列,表示到end_colx列結(jié)束取值,不包括第end_colx的值;
- start_colx默認(rèn)為0,end_colx默認(rèn)為None:表示取整行相關(guān)數(shù)據(jù);
- SheetObject.get_rows():獲取某一sheet所有行的生成器
6.對(duì)Sheet對(duì)象中的列操作
- SheetObject.ncols:獲取某sheet中的有效列數(shù)
- SheetObject.col_values(self, colx[, start_rowx=0, end_rowx=None]):獲取sheet中第colx+1列從start_rowx行到end_rowx行的數(shù)據(jù),返回值為列表。
- SheetObject.col_slice(colx[, start_rowx=0, end_rowx=None]):以切片方式獲取sheet中第colx+1列從start_rowx行到end_rowx行的數(shù)據(jù),返回值為列表。
- 列表每個(gè)值內(nèi)容為: 單元類型:單元數(shù)據(jù)
- SheetObject.col_types(colx[, start_rowx=0, end_rowx=None]):獲取sheet中第colx+1列從start_rowx行到end_rowx行的單元類型,返回值為列表;
7.對(duì)Sheet對(duì)象的單元格執(zhí)行操作
- ShellObeject.cell(rowx, colx):獲取sheet對(duì)象中第rowx+1行,第colx+1列的單元對(duì)象,返回值為'xlrd.sheet.Cell'類型,返回值的格式為“單元類型:單元值”。
- ShellObject.cell_value(rowx, colx):獲取sheet對(duì)象中第rowx+1行,第colx+1列的單元數(shù)據(jù),返回值為當(dāng)前值的類型(如float、int、string...);
- ShellObject.cell_type(rowx, colx):獲取sheet對(duì)象中第rowx+1行,第colx+1列的單元數(shù)據(jù)類型值;
- 單元類型ctype:empty為0,string為1,number為2,date為3,boolean為4, error為5;
在Python編譯器中安裝xlrd
pip install xlrd
注:高版本的xlrd目前去除了xlsx格式的支持,支持xls格式,目前使用有兩種方式: 1.刪除高版本,重裝xlrd
xlrd.biffh.XLRDError: Excel xlsx file; not supported pip install xlrd==1.2.0
2.打開xlsx文件,另存為xls格式

2.詳細(xì)代碼
引入相關(guān)庫(kù)
import xlrd import requests import json
實(shí)例代碼
讀取excel
read_path = r"xx\xx.xls" # excel文件路徑 bk = xlrd.open_workbook(read_path)
獲取所有sheet,取第1個(gè)sheet頁(yè),如果有多個(gè)sheet也可以使用sheet_by_name()方法
try:
sh = bk.sheets()[0]
except:
print("no sheet in %s" % read_path)
獲取表中的總行數(shù)
def is_json(msg):
if isinstance(msg, str): # 判斷是否是字符串
try:
json.loads(msg)
except ValueError:
return False
return True
else:
return False
由于數(shù)據(jù)存在文本和json格式數(shù)據(jù),需要先進(jìn)行判斷 判斷是否是json格式數(shù)據(jù)
def is_json(msg):
if isinstance(msg, str): # 判斷是否是字符串
try:
json.loads(msg)
except ValueError:
return False
return True
else:
return False
表中第一行有標(biāo)題,需要從第2行開始
for i in range(1, nrows):
# print("下載第 %d 個(gè)圖片" % i)
picList = [] # 定義存放圖片的list
# 讀取C列數(shù)據(jù)
C_name = sh.cell_value(i, 2)
print('C_name: ', C_name)
# 讀取D列數(shù)據(jù) excel表中存在一行有多個(gè)圖片情況,使用“;”對(duì)數(shù)據(jù)進(jìn)行分隔,分別拿到每一個(gè)json格式數(shù)據(jù)
D_name = sh.cell_value(i, 3).split(";")
print('D_name: ', D_name)
# 循環(huán)獲取所有的json
for d_value in D_name:
print('d_value:', d_value)
if is_json(d_value):# 先對(duì)json進(jìn)行判斷
picList = json.loads(d_value)['pic'] # 如果是json數(shù)據(jù)就直接取pic里的值
if len(picList): # 為空不打印
print("picList:", picList)
# 循環(huán)取出圖片地址 使用enumerate獲取每個(gè)圖片下標(biāo)
for j, picUrl in enumerate(picList):
# 根據(jù)URL下載到本地
f = requests.get(picUrl)
# 需要先創(chuàng)建文件夾
pic_name = r"D:\xxx\Downloads\文件夾\\" + C_name + "_" + str(j + 1) + ".png" # 構(gòu)造完整文件路徑+名稱
with open(pic_name, "wb") as code:
code.write(f.content)
寫在最后
通過(guò)這種方式可以將excel表中的超鏈接圖片批量下載到本地,再使用電腦圖片查看功能直接看到excel數(shù)據(jù)中的圖片。一個(gè)小功能,不一定能滿足更多的使用場(chǎng)景,還要努力學(xué)習(xí)
以上就是Python實(shí)現(xiàn)批量下載excel表中超鏈接圖片的詳細(xì)內(nèi)容,更多關(guān)于Python下載excel超鏈接圖片的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python自動(dòng)化辦公的10個(gè)腳本合集(含源碼)
這篇文章主要為大家詳細(xì)介紹了Python自動(dòng)化辦公的10個(gè)腳本合集,這些腳本覆蓋郵件、Excel處理、圖片、PDF和歸檔等常見辦公場(chǎng)景,大家可以根據(jù)需要進(jìn)行選擇2025-11-11
python中讀取txt文件時(shí)split()函數(shù)的妙用
這篇文章主要介紹了python中讀取txt文件時(shí)split()函數(shù)的妙用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
Python使用Altair創(chuàng)建交互式數(shù)據(jù)可視化的操作指南
Altair 是一個(gè)基于 Vega-Lite 的 Python 數(shù)據(jù)可視化庫(kù),它旨在簡(jiǎn)化數(shù)據(jù)可視化的創(chuàng)建過(guò)程,尤其適用于統(tǒng)計(jì)圖表的生成,Altair 強(qiáng)調(diào)聲明式編碼方式,通過(guò)簡(jiǎn)單的語(yǔ)法,用戶能夠快速創(chuàng)建復(fù)雜的交互式圖表,本文將介紹 Altair 的基礎(chǔ)用法、常見圖表類型,需要的朋友可以參考下2024-12-12
一文詳細(xì)介紹Python中的OrderedDict對(duì)象
OrderedDict是Python標(biāo)準(zhǔn)庫(kù)collections模塊的一部分,下面這篇文章主要給大家介紹了關(guān)于Python中OrderedDict對(duì)象的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08
python中的隨機(jī)函數(shù)random的用法示例
這篇文章主要介紹了python中的隨機(jī)函數(shù)random的用法示例,詳細(xì)的介紹了python 隨機(jī)函數(shù)random的用法和示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
(手寫)PCA原理及其Python實(shí)現(xiàn)圖文詳解
這篇文章主要介紹了Python來(lái)PCA算法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望能給你帶來(lái)幫助2021-08-08
python驗(yàn)證碼識(shí)別教程之滑動(dòng)驗(yàn)證碼
這篇文章主要給大家介紹了關(guān)于python驗(yàn)證碼識(shí)別教程之滑動(dòng)驗(yàn)證碼的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06
python基于opencv 實(shí)現(xiàn)圖像時(shí)鐘
這篇文章主要介紹了python基于opencv 實(shí)現(xiàn)圖像時(shí)鐘的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-01-01
python 實(shí)現(xiàn)任務(wù)管理清單案例
這篇文章主要介紹了python 實(shí)現(xiàn)任務(wù)管理清單案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04

