使用pandas在python中循环遍历多个excel文件

时间:2016-05-23 17:25:53

标签: python excel for-loop pandas multiple-files

我知道这种问题一直都在问。但我无法找到最佳方法。

我编写了一个脚本,使用 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)失败 我相信我错过了一些东西......

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

非常感谢任何帮助

2 个答案:

答案 0 :(得分:2)

你需要改变

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的第一个(也是唯一的)字符。这可能不是有效的文件名,因此会引发错误。

答案 1 :(得分:1)

我解决了我的问题。我没有使用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)

就是这样,它做了我想要的一切。