Python實(shí)現(xiàn)批量下載excel表中超鏈接圖片
背景
導(dǎo)出數(shù)據(jù)到excel,excel數(shù)據(jù)中有圖片鏈接,在excel中沒(méi)法直接看到圖片是什么樣的,需要批量下載圖片的指定文件夾,再進(jìn)行查看,想到了用python生成一個(gè)腳本文件做批量操作,試著寫(xiě)一下。
數(shù)據(jù)格式
數(shù)據(jù)類(lèi)型有文本,也有帶圖片鏈接的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, ...]) 打開(kāi)excel文件
- filename:需操作的文件名(包括文件路徑和文件名稱(chēng));
- 若filename不存在,則報(bào)錯(cuò)FileNotFoundError;
- 若filename存在,則返回值為xlrd.book.Book對(duì)象
2.BookObject.sheet_names() 獲取Book對(duì)象中所有sheet名稱(chēng),以列表方式顯示
3.BookObject.sheets():獲取所有sheet的對(duì)象,以列表形式顯示 BookObject.sheet_by_index(sheetx):通過(guò)sheet索引獲取所需sheet對(duì)象
- sheetx為索引值,索引從0開(kāi)始計(jì)算;
- 若sheetx超出索引范圍,則報(bào)錯(cuò)IndexError;
- 若sheetx在索引范圍內(nèi),則返回值為xlrd.sheet.Sheet對(duì)象
4.BookObject.sheet_by_name(sheet_name):通過(guò)sheet名稱(chēng)獲取所需sheet對(duì)象 - sheet_name為sheet名稱(chēng);- 若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)容為: 單元類(lèi)型:單元數(shù)據(jù)
- SheetObject.row_slice(rowx[, start_colx=0, end_colx=None]):以切片方式獲取sheet中第rowx+1行從start_colx列到end_colx列的單元,返回值為列表;
- 列表每個(gè)值內(nèi)容為: 單元類(lèi)型:單元數(shù)據(jù)
- SheetObject.row_types(rowx[, start_colx=0, end_colx=None]):獲取sheet中第rowx+1行從start_colx列到end_colx列的單元類(lèi)型,返回值為array.array類(lèi)型。
- 單元類(lèi)型ctype:empty為0,string為1,number為2,date為3,boolean為4, error為5(左邊為類(lèi)型,右邊為類(lèi)型對(duì)應(yīng)的值);
- SheetObject.row_len(rowx):獲取sheet中第rowx+1行的長(zhǎng)度
- rowx:行標(biāo),行數(shù)從0開(kāi)始計(jì)算(0表示第一行), 必填參數(shù);
- start_colx:起始列,表示從start_colx列開(kāi)始取值,包括第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)容為: 單元類(lèi)型:單元數(shù)據(jù)
- SheetObject.col_types(colx[, start_rowx=0, end_rowx=None]):獲取sheet中第colx+1列從start_rowx行到end_rowx行的單元類(lèi)型,返回值為列表;
7.對(duì)Sheet對(duì)象的單元格執(zhí)行操作
- ShellObeject.cell(rowx, colx):獲取sheet對(duì)象中第rowx+1行,第colx+1列的單元對(duì)象,返回值為'xlrd.sheet.Cell'類(lèi)型,返回值的格式為“單元類(lèi)型:單元值”。
- ShellObject.cell_value(rowx, colx):獲取sheet對(duì)象中第rowx+1行,第colx+1列的單元數(shù)據(jù),返回值為當(dāng)前值的類(lèi)型(如float、int、string...);
- ShellObject.cell_type(rowx, colx):獲取sheet對(duì)象中第rowx+1行,第colx+1列的單元數(shù)據(jù)類(lèi)型值;
- 單元類(lèi)型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.打開(kāi)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行開(kāi)始
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)造完整文件路徑+名稱(chēng) with open(pic_name, "wb") as code: code.write(f.content)
寫(xiě)在最后
通過(guò)這種方式可以將excel表中的超鏈接圖片批量下載到本地,再使用電腦圖片查看功能直接看到excel數(shù)據(jù)中的圖片。一個(gè)小功能,不一定能滿(mǎn)足更多的使用場(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中RegEx在數(shù)據(jù)處理中的應(yīng)用
正則表達(dá)式(Regular?Expressions,簡(jiǎn)稱(chēng)?RegEx)是一種強(qiáng)大的文本匹配和搜索工具,它在數(shù)據(jù)處理、文本解析和字符串操作中發(fā)揮著關(guān)鍵作用,下面就跟隨小編一起來(lái)了解一下RegEx的具體使用吧2024-01-01python?random模塊常用函數(shù)基礎(chǔ)教程
這篇文章主要為大家介紹了python?random模塊常用函數(shù)基礎(chǔ)教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06python通過(guò)函數(shù)屬性實(shí)現(xiàn)全局變量的方法
這篇文章主要介紹了python通過(guò)函數(shù)屬性實(shí)現(xiàn)全局變量的方法,實(shí)例分析了Python中函數(shù)屬性的相關(guān)使用技巧,需要的朋友可以參考下2015-05-05Python學(xué)習(xí)之集合的常用方法總結(jié)
集合并不是一種數(shù)據(jù)處理類(lèi)型,而是一種中間類(lèi)型。集合(set)是一個(gè)無(wú)序、不重復(fù)的元素序列,經(jīng)常被用來(lái)處理兩個(gè)列表進(jìn)行交并差的處理性。本文將詳細(xì)講解集合的一些常用方法,感興趣的可以了解一下2022-03-03程序員寫(xiě)Python時(shí)的5個(gè)壞習(xí)慣,你有幾條?
這篇文章主要介紹了程序員寫(xiě)Python時(shí)的5個(gè)壞習(xí)慣,你有幾條?有的習(xí)慣會(huì)讓 Bug 變得隱蔽難以追蹤,當(dāng)然,也有的并沒(méi)有錯(cuò)誤,只是個(gè)人覺(jué)得不夠優(yōu)雅。本文有示例代碼,感興趣的朋友跟隨小編一起看看吧2018-11-11python制作爬蟲(chóng)爬取京東商品評(píng)論教程
本文是繼前2篇Python爬蟲(chóng)系列文章的后續(xù)篇,給大家介紹的是如何使用Python爬取京東商品評(píng)論信息的方法,并根據(jù)數(shù)據(jù)繪制成各種統(tǒng)計(jì)圖表,非常的細(xì)致,有需要的小伙伴可以參考下2016-12-12