Python3.9+Pandas互转xlsx与csv时€符号丢失问题求解
修复CSV与XLSX互转时€符号丢失的问题
问题原因
- CSV转XLSX场景:Pandas默认会尝试解析包含数字的字符串为数值类型,当内容是
5€这类数字在前、符号在后的格式时,解析器会自动剥离末尾的非数字字符,只保留数值5。 - XLSX转CSV场景:如果XLSX中带€的单元格是通过自定义格式(如
0"€")设置的,Pandas读取的是单元格底层的数值,而非显示的完整文本5€,导致导出CSV时丢失符号。
解决方案
针对两种转换场景分别调整代码,确保带€的内容被完整保留:
1. CSV转XLSX:强制保留原始文本格式
读取CSV时,指定所有列的类型为字符串,避免Pandas自动解析数值剥离€符号;如果需要保留部分列的数值类型,可以针对性设置dtype或使用converters。
2. XLSX转CSV:读取单元格显示值而非底层数值
使用openpyxl直接读取单元格的显示文本,确保自定义格式的带€内容被完整提取。
修改后的完整代码
import os import pandas as pd from openpyxl import load_workbook for file_path in self.input_files: file_name, file_ext = os.path.splitext(file_path) output_file = os.path.join(self.output_folder, os.path.basename(file_name)) if file_ext.lower() == '.csv': output_file += '.xlsx' # 强制所有列为字符串类型,保留原始文本 df = pd.read_csv( file_path, delimiter=';', quotechar='"', decimal=',', encoding='utf-8-sig', dtype=str # 关键:避免自动解析数值剥离€ ) df.to_excel(output_file, index=False) elif file_ext.lower() == '.xlsx': output_file += '.csv' # 使用openpyxl读取单元格显示值 wb = load_workbook(file_path, data_only=False) # data_only=False才能读取显示值 ws = wb.active # 读取表头 headers = [cell.value for cell in ws[1]] # 读取所有行的显示文本 rows_data = [] for row in ws.iter_rows(min_row=2): row_values = [cell.display_value for cell in row] rows_data.append(row_values) df = pd.DataFrame(rows_data, columns=headers) df.to_csv( output_file, index=False, sep=';', quotechar='"', decimal=',', float_format='%.15g', encoding='utf-8-sig' )
补充说明
- 如果CSV中只有部分列包含€符号,可以不用全局设置
dtype=str,而是通过converters指定特定列,例如:converters={'金额列': str},这样既保留€符号,又不影响其他数值列的解析。 - 若XLSX中的€是直接输入的文本(而非自定义格式),则原代码中
pd.read_excel即可正常读取,无需改用openpyxl。
内容的提问来源于stack exchange,提问作者Knuspa
相关产品推荐
相关产品推荐

