如何阻止Calamine读取Excel文件时自动推断数据类型?
解决Calamine读取Excel时自动推断数据类型导致数字带.0的问题
Calamine的to_python()方法会自动推断Excel单元格的数据类型,导致原本的整数被解析为带.0后缀的浮点数。由于你的pandas版本不支持Calamine引擎,无法直接用dtype=str参数,你可以通过手动处理读取后的行数据来解决这个问题:
方法一:全局转换所有数据为字符串(处理整数型浮点数)
遍历每一行的每个元素,将整数型浮点数转为整数后再转字符串,其他类型直接转字符串:
from calamine import CalamineWorkbook import pandas as pd fp = "你的Excel文件路径.xlsx" wb = CalamineWorkbook.from_path(fp) sheet = wb.get_sheet_by_name(wb.sheet_names[0]) # 读取所有行数据 all_rows = sheet.to_python() # 分离表头和数据行(如果你的文件有表头) header = all_rows[0] data_rows = all_rows[1:] processed_rows = [] for row in data_rows: processed_row = [] for item in row: # 判断是否是整数型浮点数(如4200000000.0) if isinstance(item, float) and item.is_integer(): processed_row.append(str(int(item))) else: # 其他类型直接转为字符串 processed_row.append(str(item)) processed_rows.append(processed_row) # 转换为DataFrame df = pd.DataFrame(processed_rows, columns=header) print(df[col]) # 输出示例:4200000000
方法二:针对性处理指定列(提升效率)
如果你明确知道哪些列需要处理,可以只转换目标列,避免遍历所有元素:
from calamine import CalamineWorkbook import pandas as pd fp = "你的Excel文件路径.xlsx" wb = CalamineWorkbook.from_path(fp) sheet = wb.get_sheet_by_name(wb.sheet_names[0]) all_rows = sheet.to_python() header = all_rows[0] data_rows = all_rows[1:] # 指定需要处理的列索引(比如第0列和第2列,根据实际情况调整) target_col_indices = [0, 2] processed_rows = [] for row in data_rows: processed_row = list(row) for idx in target_col_indices: item = processed_row[idx] if isinstance(item, float) and item.is_integer(): processed_row[idx] = str(int(item)) else: processed_row[idx] = str(item) processed_rows.append(processed_row) df = pd.DataFrame(processed_rows, columns=header)
原理说明
Calamine的to_python()会根据Excel单元格的存储类型自动映射为Python类型:如果单元格是数值类型(即使显示为整数),会被解析为浮点数。通过手动检查并转换这些整数型浮点数,就能得到和pandas指定dtype=str完全一致的字符串格式值。
内容的提问来源于stack exchange,提问作者euh
相关产品推荐
相关产品推荐

