-1

かなり巨大なXML構造をファイルに出力していますが、ユーザーがきれいな印刷を有効/無効にできるようにしたいと思います。

私は約150MBのデータを処理してxml.etree.ElementTreeいますが、その要素オブジェクトからツリー構造を構築しようとすると、非常に多くのメモリを使用したため、生の文字列を保存し、によって出力することで手動でこれを行います.write()。私の出力シーケンスは次のようになります。

ofile.write(pretty_print(u'\
\t\t<LexicalEntry id="%s">\n\
\t\t\t<feat att="languageCode" val="cz"/>\n\
\t\t\t<Lemma>\n\
\t\t\t\t<FormRepresentation>\n\
\t\t\t\t\t<feat att="writtenForm" val="%s"/>\n\
\t\t\t\t</FormRepresentation>\n\
\t\t\t</Lemma>\n\
\t\t\t<Sense>%s\n' % (str(lex_id), word['word'], '' if word['pos']=='' else '\n\t\t\t\t<feat att="partOfSpeech" val="%s"/>' % word['pos'])))

 コマンドラインオプションに応じて、すべてのタブ文字と改行文字を削除する必要がある関数.write()を呼び出します。pretty_print

o_parser = OptionParser()
# ....
o_parser.add_option("-p", "--prettyprint", action="store_true", dest="pprint", default=False)
# ....

def pretty_print(string):
    if not options.pprint:
        return string.strip('\n\t')
    return string

「should」と書いたのは、そうではないためです。この特定のケースでは、どの文字も削除されません。

ただし、この場合は正常に機能します。

for ss in word['synsets']:
    ofile.write(pretty_print(u'\t\t\t\t<Sense synset="%s-synset"/>\n' % ss))

最初に頭に浮かんだのは、置換に問題があるかもしれないということでしたが、pretty_print 関数内に渡された文字列を出力すると、完全に正常に見えます。

それが機能しない原因となる可能性のある提案はあり.strip()ますか?
または、これを行うためのより良い方法があれば、私はアドバイスを受け入れます

4

1 に答える 1

5

あなたの問題はstr.strip()、文字列の最初と最後からのみ削除されることです。

すべてのstr.replace()インスタンスを削除するか、行の最初と最後からインスタンスを削除する場合は、インスタンスを行に分割して各行を削除します。

また、大規模な文字列の場合、Pythonは、入力を非常に簡単にする三重引用符付きの複数行の文字列をサポートし、古いスタイルの文字列の書式設定が-に%置き換えられていることにも注意してください。str.format()これは、新しいコードで代わりに使用することをお勧めします。 。

于 2012-12-22T17:30:55.227 に答える