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

时间:2014-09-15 01:59:52

标签: python serialization pandas elementtree marytts

我收到了调试问题。

由于我在这里很新,请原谅可能的笨拙的文字墙。

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

tree.write("output3.xml")

以及

print(ET.tostring(root))

给了我

  

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

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

提前注意:

  • 据我所见,Ctrl + F我的数据不是0.029999999 ......
  • 我的数据中所有数字都四舍五入到小数点后
  • 舍入改变了什么btw?或者只是为了展示?
  • 我对此非常感到困惑,特别是因为似乎没有可谷歌类似的案例,只是几乎 - 但不完全 - 足够的。
  

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

     

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

     _serialize_xml中的

C:\ Anaconda \ lib \ xml \ etree \ ElementTree.pyc(写,   elem,encoding,qnames,namespaces)       937写(_escape_cdata(text,encoding))       电子邮件中的938表示:    - > 939 _serialize_xml(写,e,编码,qnames,无)       940写("")       941其他:

     _serialize_xml中的

C:\ Anaconda \ lib \ xml \ etree \ ElementTree.pyc(写,   elem,encoding,qnames,namespaces)       937写(_escape_cdata(text,encoding))       电子邮件中的938表示:    - > 939 _serialize_xml(写,e,编码,qnames,无)       940写("")       941其他:

     _serialize_xml中的

C:\ Anaconda \ lib \ xml \ etree \ ElementTree.pyc(写,   elem,encoding,qnames,namespaces)       937写(_escape_cdata(text,encoding))       电子邮件中的938表示:    - > 939 _serialize_xml(写,e,编码,qnames,无)       940写("")       941其他:

     _serialize_xml中的

C:\ Anaconda \ lib \ xml \ etree \ ElementTree.pyc(写,   elem,encoding,qnames,namespaces)       937写(_escape_cdata(text,encoding))       电子邮件中的938表示:    - > 939 _serialize_xml(写,e,编码,qnames,无)       940写("")       941其他:

     _serialize_xml中的

C:\ Anaconda \ lib \ xml \ etree \ ElementTree.pyc(写,   elem,encoding,qnames,namespaces)       937写(_escape_cdata(text,encoding))       电子邮件中的938表示:    - > 939 _serialize_xml(写,e,编码,qnames,无)       940写("")       941其他:

     _serialize_xml中的

C:\ Anaconda \ lib \ xml \ etree \ ElementTree.pyc(写,   elem,encoding,qnames,namespaces)       930 v = qnames [v.text]       931否则:    - > 932 v = _escape_attrib(v,encoding)       933写("%s = \"%s \""%(qnames [k],v))       934如果是text或len(elem):

     _escape_attrib中的

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

     

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...

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

从另一个程序,PRAAT,我获得了更新的时间和音高信息,存储在数据帧中,请参阅其他截图。

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

答案中的float-for-beginners链接使事情变得更加清晰。显然四舍五入根本没有帮助。

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

screenys:

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

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

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

1 个答案:

答案 0 :(得分:16)

你应该将你的问题归结为simple example这可以帮助你自己解决问题,但更重要的是,任何阅读它的人现在基本上都要猜你的意图,因为您没有显示您的代码,输入或预期输出的示例。

可能问题是您要将ElementTree属性或text的值设置为Numpy float64 object。 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)

您应该将其替换为:

et.find(".//element").text = str(float64(0.3))

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