我有数百个excel文件,我想在一列中创建一个具有excel文件名称的df,然后在第二列中创建每个选项卡的名称。我的脚本将遍历每个文件名,但我追加的方式不对,而且我找不到解决方案的运气也不多。
os.chdir(r'C:\Users\mbobak\Documents\\')
FileList = glob.glob('*.xlsx')
tabs= pd.DataFrame(columns=['filename','tabs'])
for filename in FileList:
xl = pd.ExcelFile(filename).sheet_names
tabs= tabs.append([filename,xl])
期望的输出:
filename tabs
doc1.xlsx tab1
doc1.xlsx tab2
doc1.xlsx tab3
doc1.xlsx tab4
doc2.xlsx tab1
doc2.xlsx tab2
doc2.xlsx tab3
答案 0 :(得分:4)
这是一种方法。在一个步骤中创建数据框是一种很好的做法,也是有效的。这是因为附加到列表比附加到数据帧要便宜。
FileList = glob.glob('*.xlsx')
def return_files_tabs(FileList):
for filename in FileList:
for sheet in pd.ExcelFile(filename).sheet_names:
yield [filename, sheet]
df = pd.DataFrame(list(return_files_tabs(FileList)),
columns=['Filename', 'Tab'])
<强>解释强>
sheet_names
属性中循环浏览每个文件和每个工作表。答案 1 :(得分:2)
我喜欢@jpp的答案,但是如果你不想使用发电机,我就是这样做的:
FileList = glob.glob('*.xlsx')
filenames = []
sheets = []
for filename in FileList:
for sheet in pd.ExcelFile(filename).sheet_names:
filenames.append(filename)
sheets.append(sheet)
df = pd.DataFrame(
{'Filename': filenames, 'Tab': sheets}
)