[英]Looping through multiple excel files in python using pandas
我知道這類問題一直都在問。 但是我在尋找最好的方法時遇到了麻煩。
我寫了一個腳本,使用pandas重新格式化單個excel文件。 效果很好。
現在,我想遍歷多個 excel文件,執行相同的重新格式化,並將每個excel工作表中新格式化的數據一個接一個地放置在底部。
我相信第一步是列出目錄中所有Excel文件的清單。 有很多不同的方法可以做到這一點,所以我很難找到最好的方法。
下面是我當前用於導入多個.xlsx並創建列表的代碼。
import os
import glob
os.chdir('C:\ExcelWorkbooksFolder')
for FileList in glob.glob('*.xlsx'):
print(FileList)
我不確定以前的全局代碼是否實際創建了我需要的列表。
然后我很難理解從那里去哪里。 以下代碼在pd.ExcelFile(File)
處失敗我相信我丟失了一些東西。
# create for loop
for File in FileList:
for x in File:
# Import the excel file and call it xlsx_file
xlsx_file = pd.ExcelFile(File)
xlsx_file
# View the excel files sheet names
xlsx_file.sheet_names
# Load the xlsx files Data sheet as a dataframe
df = xlsx_file.parse('Data',header= None)
# select important rows,
df_NoHeader = df[4:]
#then It does some more reformatting.
'
任何幫助是極大的贊賞
我解決了我的問題。 我沒有使用glob函數,而是使用os.listdir讀取我的所有Excel工作表,循環瀏覽每個Excel文件,重新格式化,然后將最終數據附加到表末尾。
#first create empty appended_data table to store the info.
appended_data = []
for WorkingFile in os.listdir('C:\ExcelFiles'):
if os.path.isfile(WorkingFile):
# Import the excel file and call it xlsx_file
xlsx_file = pd.ExcelFile(WorkingFile)
# View the excel files sheet names
xlsx_file.sheet_names
# Load the xlsx files Data sheet as a dataframe
df = xlsx_file.parse('sheet1',header= None)
#.... do so reformating, call finished sheet reformatedDataSheet
reformatedDataSheet
appended_data.append(reformatedDataSheet)
appended_data = pd.concat(appended_data)
就是這樣,它可以完成我想要的一切。
你需要改變
os.chdir('C:\ExcelWorkbooksFolder')
for FileList in glob.glob('*.xlsx'):
print(FileList)
只是
os.chdir('C:\ExcelWorkbooksFolder')
FileList = glob.glob('*.xlsx')
print(FileList)
為什么可以解決此問題? glob
返回一個列表。 由於您將for FileList in glob.glob(...)
,因此您將一for FileList in glob.glob(...)
遍歷該列表並將結果放入FileList
。 在循環的最后, FileList
是一個文件名-一個字符串。
當您執行此代碼時:
for File in FileList:
for x in File:
第一行會將File
分配給最后一個文件名的第一個字符(作為字符串)。 第二行將x
分配給File
的第一個(也是唯一的)字符。 這不太可能是有效的文件名,因此會引發錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.