日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python读取excel文件可读取xlsx格式和xls格式可直接读取超链接,读出为字典格式(列表套字典),处理合并单元格的问题

發(fā)布時間:2024/9/30 python 135 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python读取excel文件可读取xlsx格式和xls格式可直接读取超链接,读出为字典格式(列表套字典),处理合并单元格的问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

直接上代碼:(代碼有注釋,代碼下方有解釋)

1.可讀取excel中的xlsx格式文件

2.可讀取excel中的xls格式文件

3.可直接讀取網(wǎng)頁上的excel的超鏈接

4.解決有列合并的情況以及行合并的問題,由合并的情況,分別對應的填充

5.返回數(shù)據(jù)為 {"Sheet1":[{},{},{}....], "Sheet2":[{},{},{}....]}? ?注意,有的工作表中的名字是自己工作表的名字,這里只舉例

import os from datetime import datetime from pprint import pprint import requests import win32com.client as win32 import xlrd from collections import Counter from fake_useragent import UserAgent from xlrd import xldate_as_tupleclass ReadExcel:"""1.可讀取excel中的xlsx格式文件2.可讀取excel中的xls格式文件3.可直接讀取網(wǎng)頁上的excel的超鏈接讀出的格式為[{},{},{}]。。。每一個字典為,一行對應列名的一個字典"""def __init__(self, file_path=None, index=None, header=None, auto_header=False, url=None, headers=None):"""傳入的參數(shù)的解釋:param file_path: (str)如果要讀取的是文件,傳入路徑參數(shù),絕對路徑和相對路徑都可以,兼容性強:param index: (int)選擇第幾行為列名,索引從0開始:param header: (list)傳入列名,要與數(shù)據(jù)列對應,不建議用,除非表中沒有頭:param auto_header: (bool)自動識別列名:param url: (str)如果要直接讀取url, 直接傳入網(wǎng)頁中excel中的超鏈接:param headers: (dict)如果讀取的超鏈接,有的網(wǎng)站的文件有反爬,所以為了防止需要注意的是,file_path和url只能二選一,意為讀取文件或者超鏈接index、header、auto_header 只需要三選一即可headers 可傳可不傳,不傳時,請求頭只有User-Agent,一般的文件都可以如果你的文件也有反爬的話,建議傳入headers"""self.file_path = file_pathself.url = urlself.headers = headersself.index = indexself.header = headerself.auto_header = auto_header# 判斷文件類型if file_path is not None: # 傳入的是文件if 'xlsx' in file_path: # 如果傳入的文件是 xlsx 文件類型,將xlsx文件類型轉(zhuǎn)化為xlsx# 將原來的文件名,替換成同名不同類型的文件,即xls結尾的文件(注意這塊直接得到的是文件名,雖然傳入的完整路徑)fileName = os.path.basename(file_path).replace("xlsx", 'xls')# 文件導出的目錄路徑和文件名稱,文件名稱如上export_name = os.path.join(os.path.dirname(os.path.abspath(file_path)), fileName)self.xlsx_to_xls(file_path, export_name) # 開始進行轉(zhuǎn)換self.file_path = export_name # 設置文件路徑為轉(zhuǎn)換后的文件路徑else:# 如果是xls直接將目錄進行拼接,絕對路徑,并且設置文件路徑self.file_path = os.path.join(os.path.dirname(os.path.abspath(file_path)), os.path.basename(file_path))else: # 超鏈接if self.headers is None: # 如果沒有傳入請求頭,默認的只有隨機的User-Agentself.headers = {"User-Agent": UserAgent().random}else:# 如果傳入了請求頭,就用該請求頭,用隨機的User-Agent,有就更新,無則加入進去self.headers.update({"User-Agent": UserAgent().random})# 設置文件路徑為讀取excel超鏈接的文件之后的文件路徑,當前路徑,讀取后會刪除文件self.file_path = self.read_url_excel()# formatting_info=True, 防止merged_cells獲取合并的行或者列時為空列表self.workbook = xlrd.open_workbook(self.file_path, formatting_info=True) # 讀取文件self.sheet_names = self.workbook.sheet_names() # 獲取該文件所有的工作表名# 如果index和header都沒有傳入,則設置index為0,即就是從第一行開始讀取if self.index is None or self.header is not None:self.index = 0def merge_cell(self, sheet_info):""":param sheet_info: 傳入表格的對象:return:返回,有合并的行和列的鍵值對"""merge = {}merge_cells = sheet_info.merged_cellsfor (rlow, rhigh, clow, chigh) in merge_cells:value_mg_cell = sheet_info.cell_value(rlow, clow)if sheet_info.cell(rlow, clow).ctype == 3: # 對讀出來的時間格式進行轉(zhuǎn)換date = datetime(*xldate_as_tuple(value_mg_cell, 0))value_mg_cell = date.strftime('%Y-%m-%d')if rhigh - rlow == 1:# Merge transverse cellsfor n in range(chigh - clow - 1):merge[(rlow, clow + n + 1)] = value_mg_cellelif chigh - clow == 1:for n in range(rhigh - rlow - 1):merge[(rlow + n + 1, clow)] = value_mg_cellreturn mergedef xlsx_to_xls(self, fname, export_name, delete_flag=False):"""將xlsx文件轉(zhuǎn)化為xls文件:param fname: 傳入待轉(zhuǎn)換的文件路徑(可傳絕對路徑,也可傳入相對路徑,都可以):param export_name: 傳入轉(zhuǎn)換后到哪個目錄下的路徑(可傳絕對路徑,也可傳入相對路徑,都可以):param delete_flag: 轉(zhuǎn)換成功后,是否刪除原來的xlsx的文件,默認刪除 布爾類型:return: 無返回值"""excel = win32.gencache.EnsureDispatch('Excel.Application')excel.Visible = Falseexcel.DisplayAlerts = Falseabsolute_path = os.path.join(os.path.dirname(os.path.abspath(fname)), os.path.basename(fname))save_path = os.path.join(os.path.dirname(os.path.abspath(fname)), os.path.basename(export_name))wb = excel.Workbooks.Open(absolute_path)wb.SaveAs(save_path, FileFormat=56) # FileFormat = 51 is for .xlsx extensionwb.Close() # FileFormat = 56 is for .xls extensionexcel.Application.Quit()# 是否刪除原來的數(shù)據(jù)文件if delete_flag:os.remove(absolute_path)def list_dic(self, key_list, value_list):"""兩個列表組成字典:param key_list: 鍵名列表:param value_list: 值列表:return: 返回組成好的字典"""dic = dict(map(lambda x, y: [x, y], key_list, value_list))return dicdef read_url_excel(self):# 請求r = requests.get(url=self.url, headers=self.headers)file_b = r.content# 判斷文件類型, 確定文件類型和名稱if 'xlsx' in self.url:name = 'temp.xlsx'else:name = 'temp.xls'# 保存文件with open(name, 'wb') as f:f.write(file_b)# 判斷是否需要轉(zhuǎn)換,并且確定文件路徑if name == 'temp.xlsx':export_name = 'temp.xls'self.xlsx_to_xls(name, export_name, delete_flag=True)else:export_name = namereturn export_namedef read_excel(self):# 取出所有的工作表的名稱sheet_name_list = self.sheet_namesdic_data = {} # 所有的工作表字典,對應該工作表中的數(shù)據(jù),鍵值對形式for sheet_name in sheet_name_list:sheet_simple = [] # 每張工作表# 某個工作表的名稱sheet = self.workbook.sheet_by_name(sheet_name)if sheet.nrows != 0:auto_index = 0 # 自動識別頭在第幾行# 根據(jù)這些數(shù)據(jù)確定,行索引, 可以自己去設置,更改,按自己的需求flag_list = ['項目名稱', '工程名稱', '許可證號', '證號', '許可證編號', '建設規(guī)模','施工單位', '勘察單位', '投資額', '勘察單位', '設計單位', '工程地址', '工程地址', '層數(shù)']# 不要包含這些數(shù)據(jù)的行, 可以自己去設置,更改,按自己的需求del_list = ['表', '明細', '合計', '總計']if self.auto_header: # 自動識別頭for row_i in range(0, sheet.nrows): # 循環(huán)每一行# 每行所有數(shù)據(jù)連起來的字符串row_data = ''.join([str(r_v) for r_v in sheet.row_values(row_i)]).strip()for del_str in del_list: # 跳過表名if del_str not in row_data:for flag in flag_list:if flag in row_data: # 判斷表頭auto_index = row_iheader = [str(row_value).replace("\n", "").replace(" ", "") for row_value insheet.row_values(auto_index) ifrow_value != '']row_index = auto_index + 1else: # 手動頭或者自定義頭if self.header is None: # 如果沒有傳入表頭,則用index取表頭header = [row_value.replace("\n", "").replace(" ", "") for row_value insheet.row_values(self.index) if row_value != '']row_index = self.indexelse: # 傳入了頭,就用header = self.headerrow_index = 0values_merge_cell = self.merge_cell(sheet) # 這里是調(diào)用處理合并單元格的函數(shù)# row_index 從第幾行開始讀取for i in range(row_index, sheet.nrows): # 開始為組成字典準備數(shù)據(jù)other_line = []# 處理類型# 可參考 https://www.cnblogs.com/xxiong1031/p/7069006.htmlfor j in range(sheet.ncols):ctype = sheet.cell(i, j).ctype # 表格的數(shù)據(jù)類型cell = sheet.cell_value(i, j)if ctype == 3:# 轉(zhuǎn)成datetime對象date = datetime(*xldate_as_tuple(cell, 0))cell = date.strftime('%Y-%m-%d')other_line.append(cell)# other_line = sheet.row_values(i)# print(other_line)# print(other_line)for key in values_merge_cell.keys():if key[0] == i:if key[1] != '':other_line[key[1]] = str(values_merge_cell[key]).replace("\xa0", "")dic = self.list_dic(header, other_line) # 調(diào)用組合字典的函數(shù),傳入key和value,字典生成# print(self.url)# # pprint(dic)# print(other_line)value_list = [str(v).strip() for v in dic.values()]value_str = ''.join(value_list).strip()pass_list = del_list + flag_listpass_flag = Truefor pass_str in pass_list:if pass_str in value_str:pass_flag = Falsebreakif pass_flag and len(Counter(value_list)) > 1 and value_str != '':try:del dic['序號']except:pass# pprint(dic)sheet_simple.append(dic)dic_data[str(sheet_name)] = sheet_simpleos.remove(self.file_path)return dic_dataif __name__ == '__main__':# 讀取文件,自動識別頭readexcel = ReadExcel(file_path='./abcd/W020200220406735094729 (1).xls', auto_header=True)pprint(readexcel.read_excel())# 讀取超鏈接,自動識別頭,里面有表格合并readexcel_1 = ReadExcel(url='http://zjj.laibin.gov.cn/xxcx/bjgb/P020211122537271486773.xls', auto_header=True)pprint(readexcel_1.read_excel())

?注意的幾點問題:

1. 創(chuàng)建類,傳入?yún)?shù)是,如果是文件格式,就用file_path=‘文件路徑’ 的方式,如果是超鏈接的方式 就用 url='超鏈接'??

2. 里面的flag_list 和del_list 根據(jù)需要可以去修改,如果沒有該需求,可以把這個兩個列表設置我空列表

3.如果你讀出來的excel數(shù)據(jù)有問題,可以隨時聯(lián)系我,私聊或者評論,我會第一時間進行修改,進行更正

謝謝大家

總結

以上是生活随笔為你收集整理的Python读取excel文件可读取xlsx格式和xls格式可直接读取超链接,读出为字典格式(列表套字典),处理合并单元格的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: av大全在线 | 亚洲欧美日韩一区 | 国产成人77亚洲精品www | 色哟哟在线| 亚洲特黄一级片 | 女优视频在线观看 | 女性裸体瑜伽无遮挡 | 91香蕉视频在线看 | 黄色网在线播放 | 日本精品黄色 | 影音先锋中文字幕一区二区 | 亚洲第一视频区 | 国产模特av私拍大尺度 | 松本一香在线播放 | 青青草国产精品视频 | 免费av一区二区 | 久久在线精品视频 | 中国少妇初尝黑人巨大 | 精品少妇theporn | av国产网站| 欧美一区国产一区 | 久久国产精品免费视频 | 欧美国产在线一区 | 91福利网| 精品欧美国产 | 日韩精品一二三四区 | 一级片高清| 日韩精品中文字幕在线 | 污污视频免费网站 | 国产成人一区二区三区影院在线 | 亚洲综合小说 | 丝袜熟女一区二区三区 | 国产不卡精品视频 | 波多野一区二区三区 | 一区二区三区免费播放 | 精品久久综合 | 亚洲爱爱图 | 国产精品久久福利 | 日韩三级黄 | 一区二区在线免费 | 插吧插吧网 | 国产尤物在线 | 热久久精| 亚洲网站在线播放 | 久草视频在线观 | 日韩欧美一区在线观看 | 国产天天综合 | 精品人妻无码一区二区三区换脸 | 成人黄色电影网址 | 清冷男神被c的合不拢腿男男 | 91在线最新 | 91人人爱| 黑人巨大精品欧美黑寡妇 | 国产亚洲AV无码成人网站在线 | 亚洲精品视频免费 | 天天干天天综合 | 亚洲午夜精品福利 | 永久免费无码av网站在线观看 | 久久久久久久久福利 | 男女被到爽流尿 | 午夜肉伦伦影院 | 麻豆影视免费观看 | 伊人久久综合 | 婷婷在线免费观看 | 99国产精品| 亚洲精品久久久乳夜夜欧美 | 光明影院手机版在线观看免费 | 男人日女人逼 | 人人妻人人爽人人澡人人精品 | 成人无码久久久久毛片 | 亚洲国产精品久久久久爰色欲 | 国产一区二区波多野结衣 | 日韩成人免费视频 | 成人福利在线免费观看 | 十八禁一区二区三区 | 五月99久久婷婷国产综合亚洲 | 精品久久久久久久中文字幕 | 男ji大巴进入女人视频 | 国产有码视频 | 好吊妞视频这里只有精品 | 欧美一区二区性久久久 | www.中文字幕在线观看 | 69欧美视频 | 九九热精品视频在线观看 | xxx性视频| 国产精品伊人久久 | 91午夜交换视频 | 欧美色综合天天久久综合精品 | 黄色一级片. | 开心黄色网| 亚洲黄色一区 | 巨乳免费观看 | 国产成人综合欧美精品久久 | 99国产视频在线 | 欧美四级在线观看 | 亚洲精品国产91 | 色婷婷av一区二区三区麻豆综合 | 91综合精品 | 青青草激情视频 |