我知道这种问题一直都在问。但我无法找到最佳方法。
我编写了一个脚本,使用 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.
'
非常感谢任何帮助
答案 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)
就是这样,它做了我想要的一切。