2016-05-23 128 views
2

我知道這種類型的問題一直在問。但是我很難找出最好的方法來做到這一點。使用熊貓在Python中循環使用多個excel文件

我寫了一個腳本,使用pandas重新格式化一個excel文件。 它很好用。

現在我要遍歷多個 Excel文件中,預製品相同的格式化,並把新格式化的數據從每個在底部,一個又一個Excel工作表。

我相信第一步是製作目錄中所有excel文件的列表。 有很多不同的方法可以做到這一點,所以我很難找到最好的方法。

以下是我當前用於導入多個.xlsx並創建列表的代碼。

import os 
import glob 

os.chdir('C:\ExcelWorkbooksFolder') 
for FileList in glob.glob('*.xlsx'): 
     print(FileList) 

我不確定前面的glob代碼是否實際創建了我需要的列表。

然後我無法理解從那裏去哪裏。 下面的代碼在pd.ExcelFile(File) 失敗我beleive我失去了一些東西....

# 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. 
' 

任何幫助是極大的讚賞

+0

檢查您的縮進。空格和縮進在Python中很重要。另外,你應該避免在Python中使用'File'或'file'作爲任何類型的變量名,因爲'file'是一個內建的。 – jonchar

+0

謝謝!這是一個問題。 – brandog

回答

0

我解決了我的問題。我沒有使用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) 

這就是它,它做我想要的一切。

1

您需要更改

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(...),你會逐一走這個名單,並把結果放到FileList。在循環結束時,FileList是單個文件名 - 單個字符串。

當你這樣做代碼:

for File in FileList: 
    for x in File: 

第一行分配File最後文件名的第一個字符(字符串)。第二行將x分配給File的第一個(也是唯一)字符。這不太可能是有效的文件名,所以會引發錯誤。

+0

啊,當然可以。謝謝。但我想我仍然無法理解glob函數。我花了更多時間處理代碼並使用os.listdir來解決我的問題。儘管感謝您的幫助! – brandog

+0

'os.listdir'通常綽綽有餘(並且適合您的情況) - 它會列出目錄中的每個文件,您可以自行篩選。當你喜歡'ls */*。xls'時,'glob'對你來說很有用 - 即你想匹配通配符,尤其是作爲路徑的一部分。你可以用'os.walk'來做到這一點,但這很難; 'glob'只是返回所有匹配路徑的平面列表,這很方便。 –

+0

謝謝,現在我明白了! – brandog