10

デバッグに関する質問がありました。

私はここではまったく新しいので、ぎくしゃくしたテキストの壁の可能性を許してください.

何時間も経って、ようやくelementtreeやりたいことができましたが、結果を出力できません。

tree.write("output3.xml")

としても

print(ET.tostring(root))

私にくれます

TypeError: 0.029999999999999999 (型 float64) をシリアル化できません

ここで私を助けるためにあなたたちが何を必要としているのかわかりません。すべてのソースコードはかなり長いです。エラーメッセージも同様です。でも、その方が簡単なので、ここに投稿します...

事前の注意:

  • 私が見る限り、Ctrl + FIには0.029999999がありません...私のデータには
  • 私のデータでは、すべての数値が小数点以下 2 桁に丸められます
  • 丸めはところで何かを変えますか?それともディスプレイ用ですか?
  • 私はこれに本当に非常に混乱しています。特に、グーグルで検索できる同様のケースがないように思われ、ほとんどではあるが完全ではないケースがあるためです。

-------------------------------------------------- ------------------------- TypeError トレースバック (最近の呼び出しが最後) 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, encoding, qnames, namespaces) 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 write("") 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 write("") 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 write("") 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 write("") 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 write("") 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 write(" %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 except (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 raise TypeError( -> 1052 "%r (type %s) をシリアライズできません" % (text, type(テキスト).名前) 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...

これは、"test" という単語に含まれる特定の音声/音声について、XML に音響情報が次の順序で含まれていることを意味します: 音声の種類、長さ、時間の終点、ピッチ (f0) 曲線。f0 曲線はタプル (タイムポイント @ 経過時間のパーセンテージ、ピッチ (ヘルツ) @ タイムポイント) で構成されます。

別のプログラム PRAAT から、更新されたタイミングとピッチの情報を取得し、データフレームに保存しました。他のスクリーンショットを参照してください。

私の Python は xml を解析し、各サウンドの音響情報を上書きします。しかし、出力に失敗します。

回答の初心者向けフロートリンクにより、物事が少し明確になりました。どうやら丸めはまったく役に立ちません。

フロートなしで文字列を使用することもできますが、奇妙なことに、そこから抽出された値に round() 関数を適用しようとすると、入力がフロートではないことに抗議するため、データフレーム内のものは文字列のように見えます...

スクリーンシス:

y A。すごい。画像の評判がもっと必要です。ネズミ。リンクだけです。

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

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

4

1 に答える 1

24

問題を簡単な例に要約する必要があります。これは自分で問題を解決するのに役立つかもしれませんが、さらに重要なことは、コード、入力、または意図した出力の例を示していないため、これを読んだ人は基本的にあなたの意図を推測する必要があります.

おそらく問題は、ElementTree属性の値またはNumpyオブジェクトtextに設定していることです。ElementTree ライブラリは型を認識せず、サイレントに文字列に変換しようとしません。float64float64

たとえば、コードに次のようなものがある場合があります (コードを示していないため、コードがどのように機能するか正確にはわかりません)。

# 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 自体とその標準ライブラリのほとんどは、型チェックに関して厳密であり、数値型から文字列への自動変換は行いません。

于 2014-09-15T02:05:00.380 に答える