pandas使用map函数读取Excel指定工作表传参报错如何解决
问题场景
原有批量合并input目录下Excel文件的代码如下,此前单工作表结构下运行正常:
import pandas as pd import os path=os.chdir("input") files = os.listdir(path) df=pd.concat(map(pd.read_excel, files))
调整为多工作表结构后,需要指定读取名为RawData的工作表,尝试直接给pd.read_excel传参时报错:
TypeError: read_excel() missing 1 required positional argument: 'io'
需要确认是否可以保留map写法传入固定关键字参数,还是必须改写为循环结构。
报错原因
你写的pd.read_excel(sheet_name='RawData')会被立刻执行,此时没有传入必填的文件路径参数io,因此直接触发参数缺失错误。map的第一个参数需要传入可调用的函数对象,而不是函数执行完成后的返回值。
解决方案
不需要改写为显式for循环,两种写法都可以保留map的简洁形式:
推荐:用
functools.partial固定参数
这是最简洁、可读性最好的写法,通过partial预绑定固定关键字参数,生成新的可调用对象传入map即可:from functools import partial import pandas as pd import os os.chdir("input") files = os.listdir() # 预绑定sheet_name参数 read_raw_sheet = partial(pd.read_excel, sheet_name="RawData") df = pd.concat(map(read_raw_sheet, files))注:原代码中
path = os.chdir("input")的赋值没有实际作用,os.chdir修改工作目录后返回值为None,os.listdir(None)默认就是读取当前工作目录内容,直接写os.listdir()即可。无额外导入:用lambda匿名函数包装
如果不想额外导入模块,直接用lambda包装一层传参逻辑也可以实现相同效果:import pandas as pd import os os.chdir("input") files = os.listdir() df = pd.concat(map(lambda file: pd.read_excel(file, sheet_name="RawData"), files))
内容的提问来源于stack exchange,提问作者Ian Irvine
相关产品推荐
相关产品推荐

