Python读取Excel自定义货币格式时保留原格式的问题
解决pandas读取xls时保留自定义货币格式的问题
问题核心:pd.read_excel默认读取的是单元格的底层数值,而非Excel界面显示的格式化文本,因此设置dtype={'Price':str}无法保留带货币符号的格式。下面是可行的解决方案:
依赖准备
安装支持xls格式的旧版xlrd(2.0+版本不再支持xls):
pip install xlrd==1.2.0
单个xls文件读取函数
通过xlrd直接读取单元格的格式化显示文本,而非原始数值:
import xlrd import pandas as pd def read_xls_formatted_price(file_path): # 打开xls文件并保留格式信息 workbook = xlrd.open_workbook(file_path, formatting_info=True) sheet = workbook.sheet_by_index(0) # 读取第一个工作表,可根据需求修改 # 提取表头 headers = [sheet.cell_value(0, col) for col in range(sheet.ncols)] # 逐行读取数据 data_rows = [] for row_num in range(1, sheet.nrows): current_row = [] for col_num in range(sheet.ncols): cell = sheet.cell(row_num, col_num) # 针对Price列提取格式化文本 if headers[col_num] == 'Price': # 获取单元格的格式规则 xf = workbook.xf_list[cell.xf_index] fmt_str = workbook.format_map[xf.format_key].format_str # 按Excel格式渲染单元格内容 formatted_text = xlrd.formatting.format_cell(cell, fmt_str, workbook.datemode) current_row.append(formatted_text) else: # 其他列正常读取值 current_row.append(cell.value) data_rows.append(current_row) # 转换为DataFrame return pd.DataFrame(data_rows, columns=headers)
批量合并多个xls文件
结合glob遍历目标文件,批量读取并合并:
import glob # 替换为你的xls文件路径匹配规则(比如'./data/*.xls') target_files = glob.glob('*.xls') # 初始化合并后的空DataFrame merged_result = pd.DataFrame() # 逐个读取并合并 for file in target_files: single_df = read_xls_formatted_price(file) merged_result = pd.concat([merged_result, single_df], ignore_index=True) # 验证Price列格式 print(merged_result['Price'])
注意事项
- 确保表头中的Price列名称完全匹配(大小写、空格都要一致),否则无法触发格式提取逻辑
- 如果需要读取多个工作表,可修改
sheet_by_index或改用sheet_by_name指定目标表 - 若文件是xlsx格式,可改用openpyxl库,通过
cell.number_format配合locale模块实现格式渲染(但本次需求针对xls,故优先xlrd方案)
内容的提问来源于stack exchange,提问作者unaizhaider
相关产品推荐
相关产品推荐

