pandas的read_excel函数是否会意外修改Excel文件内的原始数据?
pandas read_excel相关问题解答
核心结论
read_excel为只读操作,完全不会修改本地存储的原始Excel文件,所有观测到的类型转换都属于内存中DataFrame生成阶段的解析行为,原始文件无任何变动。- 指定
dtype=str仍出现Excel中TRUE转换为1、FALSE转换为False的问题,属于pandas的已知解析逻辑:底层解析引擎会先对Excel单元格执行内置类型推断,该步骤优先级高于dtype参数设定。Excel原生布尔值TRUE/FALSE会在推断阶段先被转换为Python的True/False布尔对象,后续应用dtype=str规则时,部分版本的pandas会将布尔型True强制转换为字符串'1'、False转换为字符串'False',最终呈现出该现象。
解决方案
- 方案1(适配pandas ≥1.4.0版本):新增
convert_bool=False参数关闭布尔值自动转换逻辑,搭配dtype=str即可保留原始布尔值文本:df = pd.read_excel(DEFAULT_PATH_2_XLSX_FILE, dtype=str, convert_bool=False) - 方案2(全版本通用):使用
converters参数强制对指定列/全部列执行字符串转换,该参数优先级高于内置类型推断,不会触发提前的布尔值转义:- 针对指定列生效的写法示例:
# 对列名`业务列1`、`业务列2`强制转换为字符串类型 df = pd.read_excel(DEFAULT_PATH_2_XLSX_FILE, converters={ "业务列1": str, "业务列2": str }) - 针对所有列生效的写法示例:
# 先读取表头获取全量列名,再批量设置转换规则 excel_obj = pd.ExcelFile(DEFAULT_PATH_2_XLSX_FILE) first_sheet = excel_obj.sheet_names[0] all_cols = excel_obj.parse(first_sheet, nrows=0).columns.tolist() df = excel_obj.parse(first_sheet, converters={col: str for col in all_cols})
- 针对指定列生效的写法示例:
- 方案3(临时应急):无需修改代码的前提下,可提前将Excel中对应布尔值列的单元格格式修改为「文本」类型后再读取,也可规避自动类型转换。
内容的提问来源于stack exchange,提问作者Peter。
相关产品推荐
相关产品推荐

