Python實(shí)現(xiàn)讀取文件夾里Excel文件里的數(shù)據(jù)
場(chǎng)景描述
已知:文件夾路徑、Excel文件名、存放數(shù)據(jù)的Sheet名
目標(biāo):讀取目標(biāo)文件夾里目標(biāo)Excel里面目標(biāo)Sheet里的數(shù)據(jù)
思路

方法一:利用Pandas模塊
import pandas as pd
import os
#-----獲取文件夾中所有的Excel文件名-----#
path ='/Users/Desktop/test.data/' #輸入文件夾路徑
for root,dirs,files in os.walk(path): #files是文件夾里所有的文件名
for i in range(len(files)):
if '.xlsx' not in files[i]: #刪除不是Excel格式的文件名
files[i] = []
else:
files[i] = files[i]
files.remove([])
files.sort() #文件名排序
#-----獲取目標(biāo)Excel里目標(biāo)sheet里的表頭和數(shù)據(jù)-----#
file_path = path+files[0] #獲取目標(biāo)Excel的路徑
raw_data = pd.read_excel(file_path, sheet_name = None,header = None) #獲取該路徑下,Excel里面所有的數(shù)據(jù),數(shù)據(jù)類(lèi)型是字典,表格名是鍵,表格里的數(shù)據(jù)是值
sheet_names = list(raw_data.keys()) #獲取所有表格名
target_sheet_data = raw_data[sheet_names[0]] # #獲取目標(biāo)表格的數(shù)據(jù)
header_name = target_sheet_data.values[0,:] #獲取目標(biāo)表格名的表頭名
target_data = target_sheet_data.values[1:len(target_sheet_data),:] #獲取目標(biāo)表格除表頭外的數(shù)據(jù)
print(header_name)
print(target_data)方法二:利用xlrd模塊
import xlrd as xd
import numpy as np
import os
#-----獲取文件夾中所有的Excel文件名-----#
path ='/Users/Desktop/test.data/' #輸入文件夾路徑
for root,dirs,files in os.walk(path): #files是文件夾里所有的文件名
for i in range(len(files)):
if '.xlsx' not in files[i]: #刪除不是Excel格式的文件名
files[i] = []
else:
files[i] = files[i]
files.remove([])
files.sort() #文件名排序
#-----獲取目標(biāo)Excel里目標(biāo)sheet里的表頭和數(shù)據(jù)-----#
file_path = path+files[0] #獲取目標(biāo)Excel的路徑
data =xd.open_workbook (file_path) #打開(kāi)路徑下的Excel
sheet_names = data.sheet_names() # 獲取目標(biāo)Ecele里所有工作表名稱(chēng)
target_sheet_data = data.sheet_by_name(sheet_names[0]) #獲取目標(biāo)表格的數(shù)據(jù)
header_name = target_sheet_data .row_values(0) #獲取目標(biāo)表格的表頭名
target_data = []
for i in range(target_sheet_data .nrows-1):
target_data.append(target_sheet_data .row_values(i+1)) #獲取目標(biāo)表格除表頭以外的數(shù)據(jù),列表數(shù)據(jù)
target_data = np.array(target_data) #轉(zhuǎn)換成數(shù)組
print(header_name)
print(target_data) 方法補(bǔ)充
1.python批量讀取文件夾中的所有excel文件
大數(shù)據(jù)處理經(jīng)常要用到一堆表格,然后需要把數(shù)據(jù)導(dǎo)入一個(gè)list中進(jìn)行各種算法分析,簡(jiǎn)單講一下自己的做法:
如何讀取excel文件
網(wǎng)上的版本很多,在xlrd模塊基礎(chǔ)上,找到一些源碼:
import xdrlib ,sys
import xlrd
def open_excel(file="C:/Users/flyminer/Desktop/新建 Microsoft Excel 工作表.xlsx"):
data = xlrd.open_workbook(file)
return data
#根據(jù)索引獲取Excel表格中的數(shù)據(jù) 參數(shù):file:Excel文件路徑 colnameindex:表頭列名所在行的所以 ,by_index:表的索引
def excel_table_byindex(file="C:/Users/flyminer/Desktop/新建 Microsoft Excel 工作表.xlsx",colnameindex=0,by_index=0):
data = open_excel(file)
table = data.sheets()[by_index]
nrows = table.nrows #行數(shù)
ncols = table.ncols #列數(shù)
colnames = table.row_values(colnameindex) #某一行數(shù)據(jù)
list =[]
for rownum in range(1,nrows):
row = table.row_values(rownum)
if row:
app = {}
for i in range(len(colnames)):
app[colnames[i]] = row[i]
list.append(app)
return list
#根據(jù)名稱(chēng)獲取Excel表格中的數(shù)據(jù) 參數(shù):file:Excel文件路徑 colnameindex:表頭列名所在行的所以 ,by_name:Sheet1名稱(chēng)
def excel_table_byname(file="C:/Users/flyminer/Desktop/新建 Microsoft Excel 工作表.xlsx",colnameindex=0,by_name=u'Sheet1'):
data = open_excel(file)
table = data.sheet_by_name(by_name)
nrows = table.nrows #行數(shù)
colnames = table.row_values(colnameindex) #某一行數(shù)據(jù)
list =[]
for rownum in range(1,nrows):
row = table.row_values(rownum)
if row:
app = {}
for i in range(len(colnames)):
app[colnames[i]] = row[i]
list.append(app)
return list
def main():
tables = excel_table_byindex()
for row in tables:
print(row)
tables = excel_table_byname()
for row in tables:
print(row)
if __name__=="__main__":
main()最后一句是重點(diǎn),所以這里也給代碼人點(diǎn)個(gè)贊!
最后一句讓代碼里的函數(shù)都可以被復(fù)用,簡(jiǎn)單地說(shuō):假設(shè)文件名是a,在程序中import a以后,就可以用a.excel_table_byname()和a.excel_table_byindex()這兩個(gè)超級(jí)好用的函數(shù)了。
然后是遍歷文件夾取得excel文件以及路徑:,原創(chuàng)代碼如下:
import os
import xlrd
import test_wy
xpath="E:/唐偉捷/電力/電力系統(tǒng)總文件夾/舟山電力"
xtype="xlsx"
typedata = []
name = []
raw_data=[]
file_path=[]
def collect_xls(list_collect,type1):
#取得列表中所有的type文件
for each_element in list_collect:
if isinstance(each_element,list):
collect_xls(each_element,type1)
elif each_element.endswith(type1):
typedata.insert(0,each_element)
return typedata
#讀取所有文件夾中的xls文件
def read_xls(path,type2):
#遍歷路徑文件夾
for file in os.walk(path):
for each_list in file[2]:
file_path=file[0]+"/"+each_list
#os.walk()函數(shù)返回三個(gè)參數(shù):路徑,子文件夾,路徑下的文件,利用字符串拼接file[0]和file[2]得到文件的路徑
name.insert(0,file_path)
all_xls = collect_xls(name, type2)
#遍歷所有type文件路徑并讀取數(shù)據(jù)
for evey_name in all_xls:
xls_data = xlrd.open_workbook(evey_name)
for each_sheet in xls_data.sheets():
sheet_data=test_wy.excel_table_byname(evey_name,0,each_sheet.name)
#請(qǐng)參考讀取excel文件的代碼
raw_data.insert(0, sheet_data)
print(each_sheet.name,":Data has been done.")
return raw_data
a=read_xls(xpath,xtype)
print("Victory")2.Python使用pandas讀取目錄下所有Excel文件并拼接
首先,我們需要導(dǎo)入pandas庫(kù)和os庫(kù)。pandas庫(kù)用于數(shù)據(jù)處理,而os庫(kù)用于操作文件系統(tǒng)。
在Python中,我們可以使用以下代碼來(lái)讀取指定目錄下的所有Excel文件:
import pandas as pd
import os
# 指定目錄路徑
dir_path = '/path/to/directory'
# 獲取目錄下所有Excel文件名
file_names = [f for f in os.listdir(dir_path) if f.endswith('.xlsx') or f.endswith('.xls')]
# 創(chuàng)建一個(gè)空的DataFrame用于存儲(chǔ)所有數(shù)據(jù)
df_all = pd.DataFrame()
# 循環(huán)讀取每個(gè)Excel文件,并將它們拼接到df_all中
for file_name in file_names:
file_path = os.path.join(dir_path, file_name)
df = pd.read_excel(file_path)
df_all = df_all.append(df, ignore_index=True)在上面的代碼中,我們首先指定了要讀取的目錄路徑。然后,我們使用os庫(kù)的listdir函數(shù)獲取該目錄下所有以.xlsx或.xls為擴(kuò)展名的文件名。接下來(lái),我們創(chuàng)建了一個(gè)空的DataFrame,用于存儲(chǔ)所有數(shù)據(jù)。然后,我們循環(huán)讀取每個(gè)Excel文件,并使用pandas的read_excel函數(shù)將其轉(zhuǎn)換為DataFrame對(duì)象。最后,我們將每個(gè)DataFrame對(duì)象拼接到df_all中。
注意,在拼接DataFrame時(shí),我們使用了ignore_index=True參數(shù)。這是因?yàn)楫?dāng)我們將多個(gè)DataFrame拼接在一起時(shí),默認(rèn)情況下會(huì)保留原來(lái)的行索引,這可能會(huì)導(dǎo)致重復(fù)的行索引。使用ignore_index=True參數(shù)可以重新設(shè)置行索引,確保每個(gè)DataFrame都有唯一的行索引。
另外需要注意的是,如果目錄下有多個(gè)Excel文件,并且這些文件有相同的列名,那么在拼接時(shí)可能會(huì)導(dǎo)致列名重復(fù)。為了避免這種情況,可以在讀取每個(gè)Excel文件后將其重命名,以確保每個(gè)文件的列名都是唯一的??梢允褂靡韵麓a將每個(gè)文件的列重命名:
df = df.rename(columns=lambda x: f'{file_name}_{x}')在上面的代碼中,我們使用了lambda函數(shù)來(lái)為每個(gè)文件的列名添加一個(gè)前綴,該前綴是文件名加上下劃線(xiàn)。這樣就可以確保每個(gè)文件的列名都是唯一的。
通過(guò)以上步驟,我們就可以使用pandas庫(kù)在Python中讀取指定目錄下的所有Excel文件,并將它們拼接成一個(gè)大的數(shù)據(jù)表
到此這篇關(guān)于Python實(shí)現(xiàn)讀取文件夾里Excel文件里的數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Python讀取Excel數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python之實(shí)現(xiàn)兩個(gè)或多個(gè)列表相加
這篇文章主要介紹了python之實(shí)現(xiàn)兩個(gè)或多個(gè)列表相加方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08
pyqt5 實(shí)現(xiàn)工具欄文字圖片同時(shí)顯示
今天小編就為大家分享一篇pyqt5 實(shí)現(xiàn)工具欄文字圖片同時(shí)顯示的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06
Python中defaultdict方法常見(jiàn)的使用方法及問(wèn)題解答
Python?defaultdict?是?collections?模塊的?dict?子類(lèi),自動(dòng)處理缺失鍵,這篇文章主要介紹了Python中defaultdict方法常見(jiàn)的使用方法及問(wèn)題解答,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-07-07
np.concatenate()函數(shù)數(shù)組序列參數(shù)的實(shí)現(xiàn)
本文主要介紹了np.concatenate()函數(shù)數(shù)組序列參數(shù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03

