0

Pythonで2つのファイルを開き、それらのコンテンツの一部を変更および置換して、新しい出力を3番目のファイルに書き込みます。私の2つの入力ファイルはXMLであり、「BOMなしのUTF-8」でエンコードされており、ドイツ語のÄ、Ö、Ü、ßが含まれています。出力XMLファイルをNotepad++で開くと、エンコードが指定されていません(つまり、[エンコード]タブでエンコードがチェックされていません)。私のÄ、Ö、Üとßは次のようなものに変換されます

ü

Pythonで出力を作成するときは、

with open('file', 'w') as fout:
  fout.write(etree.tostring(tree.getroot()).decode('utf-8'))

代わりに何をする必要がありますか?

4

4 に答える 4

2

私はこれがうまくいくと思います:

import codecs

with codecs.open("file.xml", 'w', "utf-8") as fout:
    # do stuff with filepointer
于 2012-07-18T08:44:25.873 に答える
2

生のバイト文字列を書き込むときは、ファイルをバイナリモードで開きます。

with open('file', 'wb') as fout:
    fout.write(xyz)

それ以外の場合、open呼び出しはファイルをテキストモードで開き、代わりにUnicode文字列を期待し、それらをエンコードします。

デコードすることは、エンコーディング(utf-8など)を解釈することであり、出力はユニコードテキストです。最初にデコードする場合は、ファイルをテキストモードで開くときにエンコードを指定します。

with open(file, 'w', encoding='utf-8') as fout:
    fout.write(xyz.decode('utf-8'))

エンコーディングを指定しない場合、Pythonはデフォルトを使用します。これは通常、悪いことです。最初からUTF-8でエンコードされたバイト文字列がすでにあるため、これは実際には役に立たないことに注意してください。

Pythonファイル操作は既存のUnicodeポイントをXML文字エンティティ(などü)に変換しないことに注意してください。他のコードでこれを行うことはできますが、それを私たちと共有しませんでした。

エンコーディングとユニコードを理解することになると、Unicodeに関するJoelSpolskyの記事は非常に貴重であることがわかりました。

于 2012-07-18T08:45:06.220 に答える
2

文字エンコードを使用して名前が付けられたファイルにElementTreeオブジェクトを書き込むには、次のようにします。tree'file''utf-8'

tree.write('file', encoding='utf-8')
于 2012-07-18T09:28:50.607 に答える
1

xml.etree.ElementTreePython2とその関数についての説明parse()。この関数は、最初の引数としてソースを取ります。または、開いているファイルオブジェクトにすることも、ファイル名にすることもできます。関数はインスタンスを作成し、次のようなElementTree引数をに渡します。tree.parse(...)

def parse(self, source, parser=None):
    if not hasattr(source, "read"):
        source = open(source, "rb")
    if not parser:
        parser = XMLParser(target=TreeBuilder())
    while 1:
        data = source.read(65536)
        if not data:
            break
        parser.feed(data)
    self._root = parser.close()
    return self._root

3行目から、ファイル名が渡された場合、ファイルはバイナリモードで開かれていることが推測できます。このように、ファイルコンテンツがUTF-8であった場合、UTF-8でエンコードされたバイナリコンテンツで要素を処理しています。この場合、出力ファイルもバイナリモードで開く必要があります。

もう1つの可能性はcodecs.open(filename, encoding='utf-8')、入力ファイルを開き、開いているファイルオブジェクトをに渡すために使用することxml.etree.ElementTree.parse(...)です。このように、ElementTreeインスタンスはUnicode文字列で機能するため、コンテンツを書き戻すときに結果をUTF-8にエンコードする必要があります。この場合、codecs.open(...)UTF-8で書き込みにも使用できます。開いた出力ファイルオブジェクトを上記のに渡すtree.write(f)ファイルを開いてもらうことがtree.write(filename, encoding='utf-8')できます。

于 2012-07-18T10:42:31.737 に答える