10

重複の可能性:
Python で JSON から Unicode オブジェクトではなく文字列オブジェクトを取得する方法は?

JSON API 呼び出しから解析されたマルチレベル辞書として多くの入力があります。文字列はすべてユニコードであるため、多くのu'stuff like this'. jqを使用して結果をいじっており、これらの結果を ASCII に変換する必要があります。

そのように変換するだけの関数を書くことができることを私は知っています:

def convert(input):
    if isinstance(input, dict):
        ret = {}
        for stuff in input:
            ret = convert(stuff)
    elif isinstance(input, list):
        ret = []
        for i in range(len(input))
            ret = convert(input[i])
    elif isinstance(input, str):
        ret = input.encode('ascii')
    elif :
        ret = input
    return ret

これも正しいですか?わからない。聞きたいのはそこじゃないけど。

私が求めているのは、これが問題に対する典型的な力ずくの解決策だということです。もっと良い方法があるはずです。よりpythonicな方法。私はアルゴリズムの専門家ではありませんが、これも特に高速に見えません。

それで、より良い方法はありますか?または、そうでない場合、この機能を改善できますか...?


回答後の編集

Mark Amery の答えは正しいですが、修正版を投稿したいと思います。彼の関数は Python 2.7+ で動作し、私は 2.6 を使用しているため、変換する必要がありました。

def convert(input):
    if isinstance(input, dict):
        return dict((convert(key), convert(value)) for key, value in input.iteritems())
    elif isinstance(input, list):
        return [convert(element) for element in input]
    elif isinstance(input, unicode):
        return input.encode('utf-8')
    else:
        return input
4

1 に答える 1

30

再帰はここに行く方法のように思えますが、python 2.xx を使用している場合は、チェックしたいのでunicodeはなくstr(str型はバイトの文字列を表し、unicode型は Unicode 文字の文字列を表します。どちらも他から継承しません)インタプリタに表示されるのは unicode タイプの文字列で、前に au が付いています)。

投稿されたコードには小さな構文エラーもあります (末尾elif:は である必要がありelseます)。入力が辞書またはリストの場合、同じ構造を返しません。(辞書の場合、最終キーの変換バージョンを返します。リストの場合、最終要素の変換バージョンを返します。どちらも正しくありません!)

内包表記を使用して、コードをきれいで Pythonic にすることもできます。

そこで、私がお勧めするのは次のとおりです。

def convert(input):
    if isinstance(input, dict):
        return {convert(key): convert(value) for key, value in input.iteritems()}
    elif isinstance(input, list):
        return [convert(element) for element in input]
    elif isinstance(input, unicode):
        return input.encode('utf-8')
    else:
        return input

最後に 1 つ。に変更encode('ascii')しましたencode('utf-8')。私の理由は次のとおりです。ASCII文字セットの文字のみを含むUnicode文字列は、ASCIIでエンコードされた場合、utf-8でエンコードされた場合と同じバイト文字列で表されるため、ASCIIの代わりにutf-8を使用しても何も壊れず、扱っている Unicode 文字列が ASCII 文字のみを使用している限り、変更は目に見えません。ただし、この変更により関数の範囲が拡張され、ASCII 文字セットだけでなく、Unicode 文字セット全体の文字列を処理できるようになりました。

于 2012-10-27T16:01:56.393 に答える