如何解决TypeError:无法序列化浮点Python Elementtree

sib*_*ert 6 python serialization elementtree pandas marytts

我收到了调试问题.

由于我在这里很新,请原谅可能的janky文本墙.

几个小时后我终于elementtree做了我想做的事,但我无法输出我的结果,因为

tree.write("output3.xml")
Run Code Online (Sandbox Code Playgroud)

以及

print(ET.tostring(root))
Run Code Online (Sandbox Code Playgroud)

给我

TypeError:无法序列化0.029999999999999999(类型为float64)

我不知道你们需要在这里帮助我,所有的源代码都很冗长.错误消息也是如此.但这有点容易,所以我在这里发布......

提前说明:

  • 据我所见,Ctrl + FI在我的数据中没有0.029999999 ....
  • 在我的数据中,所有数字都舍入到2位小数
  • 四舍五入改变什么btw?还是只是为了展示?
  • 我真的非常困惑,特别是因为似乎没有可谷歌类似的情况,只是几乎 - 但不是完全足够的.

-------------------------------------------------- ------------------------- TypeError Traceback(最近一次调用last)in()----> 1 tree.write("output3.xml" ")

C:\ Anaconda\lib\xml\etree\ElementTree.pyc in write(self,file_or_filename,encoding,xml_declaration,default_namespace,method)818)819 serialize = _serialize [method] - > 820 serialize(write,self._root,编码,qnames,名称空间)821如果file_or_filename不是文件:822 file.close()

C:\ Anaconda\lib\xml\etree\ElementTree.pyc in _serialize_xml(write,elem,encoding,qnames,namespaces)937 write(_escape_cdata(text,encoding))938 for e in elem: - > 939 _serialize_xml(write ,e,编码,qnames,无)940写("")941其他:

C:\ Anaconda\lib\xml\etree\ElementTree.pyc in _serialize_xml(write,elem,encoding,qnames,namespaces)937 write(_escape_cdata(text,encoding))938 for e in elem: - > 939 _serialize_xml(write ,e,编码,qnames,无)940写("")941其他:

C:\ Anaconda\lib\xml\etree\ElementTree.pyc in _serialize_xml(write,elem,encoding,qnames,namespaces)937 write(_escape_cdata(text,encoding))938 for e in elem: - > 939 _serialize_xml(write ,e,编码,qnames,无)940写("")941其他:

C:\ Anaconda\lib\xml\etree\ElementTree.pyc in _serialize_xml(write,elem,encoding,qnames,namespaces)937 write(_escape_cdata(text,encoding))938 for e in elem: - > 939 _serialize_xml(write ,e,编码,qnames,无)940写("")941其他:

C:\ Anaconda\lib\xml\etree\ElementTree.pyc in _serialize_xml(write,elem,encoding,qnames,namespaces)937 write(_escape_cdata(text,encoding))938 for e in elem: - > 939 _serialize_xml(write ,e,编码,qnames,无)940写("")941其他:

C:\ Anaconda\lib\xml\etree\ElementTree.pyc in _serialize_xml(write,elem,encoding,qnames,namespaces)930 v = qnames [v.text] 931 else: - > 932 v = _escape_attrib(v,encoding )933写("%s = \"%s \""%(qnames [k],v))934 if text或len(elem):

C:\ Anaconda\lib\xml\etree\ElementTree.pyc in _escape_attrib(text,encoding)1090 return text.encode(encoding,"xmlcharrefreplace")1091除外(TypeError,AttributeError): - > 1092 _raise_serialization_error(text)1093 1094 def _escape_attrib_html(文本,编码):

C:\ Anaconda\lib\xml\etree\ElementTree.pyc in _raise_serialization_error(text)1050 def _raise_serialization_error(text):1051引发TypeError( - > 1052"无法序列化%r(类型%s)"%(文本,类型(文字).姓名)1053)1054

TypeError:无法序列化0.029999999999999999(类型为float64)

好的,首先编辑.我将粘贴我想要实现的精华的截图.

手头的任务是使用python和pandas并elementtree更新xml文件.

该文件由文本到语音系统MARY输出,并包含如何合成给定话语的信息.

该文件具有以下结构(简化)

<phrase>
<word>
<syllable = "t e s t">
<phone = "t" duration = "30" end = "230">
<phone = "e" duration = "90" end = "320" f0 = "(25,144)(50,145)(75,150)(100,149)">
...and so on...see screenshot for details...
Run Code Online (Sandbox Code Playgroud)

这意味着对于"测试"一词中的任何给定电话/声音,XML按顺序包含声音信息:声音类型,长度,时间终点,音高(f0)曲线.f0曲线由元组组成(时间点@经过的时间百分比,音高(以赫兹为单位)@时间点)

从另一个节目PRAAT中,我获得了更新的时间和音高信息,存储在数据帧中,参见其他截图.

我的Python解析xml并覆盖每个声音的声学信息.但后来无法输出.

答案中的浮动初学者链接使事情变得更加清晰.显然四舍五入根本没有帮助.

我可能没有浮点数并且使用字符串,但奇怪的是我的Dataframe中的东西似乎是BE字符串,因为当我尝试对从那里提取的任何值应用round()函数时,它会抗议输入不是浮点数...

screenys:

雅.大.需要更多的图像声誉.老鼠.所以只是链接.

http://puu.sh/bzQQr/6fed162db8.png

http://puu.sh/bzQNq/23490bfb63.png

Dan*_*ski 20

你应该把问题归结为一个简单的例子.这可以帮助您自己解决问题,但更重要的是,现在读取它的任何人基本上都必须猜测您的意图,因为您没有显示您的代码,输入或预期输出的示例.

有可能的问题是,你要设置的值ElementTree属性或text一个NumPy的float64对象.ElementTree库不知道float64类型,也不会尝试将其静默转换为字符串.

例如,你的代码中可能有这样的东西(我不知道你的代码是如何工作的,因为你没有显示它):

# the value 0.3 cannot be exactly represented in floating points
# read this for starters: https://docs.python.org/3/tutorial/floatingpoint.html
et.find(".//element").text = float64(0.3)
Run Code Online (Sandbox Code Playgroud)

你应该用这个替换它:

et.find(".//element").text = str(float64(0.3))
Run Code Online (Sandbox Code Playgroud)

Python本身及其大多数标准库对类型检查都很严格,不会自动从数字类型转换为字符串.