pandas写入XML文件时将数值转换为整数去除小数位的方法
CSV转XML时SubID属性带.0后缀问题修复
问题原因
pandas读取CSV自动推断类型时,会把无小数的ID类列识别为float64浮点型,直接调用str()转换浮点值就会生成带.0后缀的字符串,不符合整数ID的格式要求。
修复方法
在给XML属性赋值前,先将ID类字段转为整数类型再转字符串即可;也可以在读取CSV时直接指定ID列的类型为整数,从源头规避类型问题。
修改后可直接运行的核心代码
import xml.etree.ElementTree as ET import pandas as pd root = ET.Element('AA_ITEMS') # 推荐读取CSV时就指定整数列类型,从根源避免浮点数问题,替换为你实际的CSV读取逻辑 # df = pd.read_csv('你的csv文件路径', dtype={'Id': int, 'SubID': int, 'Rank': int}) for o_id, df_group in df.groupby('Id'): # 修正原代码列名大小写不匹配问题,同时转int兜底避免Id出现.0后缀 id_node = ET.Element('Id', {'ID': str(int(o_id))}) for _, row in df_group.iterrows(): # 核心修复:SubID先转int再转字符串,去除.0后缀 sub_id_node = ET.Element('SubId', {'ID': str(int(row['SubID']))}) rank_node = ET.Element('Rank') # Rank为整数,同样做int转换兜底 rank_node.text = str(int(row['Rank'])) size_node = ET.Element('Size') size_node.text = str(row['Size']) sub_id_node.append(rank_node) sub_id_node.append(size_node) id_node.append(sub_id_node) root.append(id_node) # 生成完整合法XML,自动补全闭合标签 min_xml = ET.tostring(root, encoding='utf8') with open('/tmp/{}'.format(self.blob_name.split('.')[0]+'.xml'), "wb") as file: file.write(min_xml)
修复后效果
生成的SubId节点属性将和CSV原始格式一致,示例:
<SubId ID="123"> <Rank>1</Rank> <Size>0.1</Size> </SubId>
注:你贴出的当前输出XML存在标签未闭合、Id=2分组下SubID顺序颠倒的问题,是示例内容截断/分组逻辑未排序导致的,如果需要固定顺序可以在groupby前对DataFrame按Id、Rank字段排序即可。
内容的提问来源于stack exchange,提问作者TalendDeveloper
相关产品推荐
相关产品推荐

