2015-12-17 8 views
6

さまざまなPythonオブジェクトのリストを1つの文字列に連結したいと考えています。オブジェクトは文字通り何でもかまいません。私は単純に次のコードを使用してこれを行うことが考えた:Pythonオブジェクトを文字列に変換する方法は?

' '.join([str(x) for x in the_list]) 

が、残念ながらそれは時々私にUnicodeEncodeErrorをを与える:

this SO answer
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 80: ordinal not in range(128) 

私はそう、私は.encode('utf-8')を使用する必要があると述べている誰かを見つけました

' '.join([x.encode('utf-8') for x in the_list]) 

しかし、オブジェクトは、文字列またはユニコードなく、例えばされていない場合:私はこれに私のコードを変更しました10秒私はAttributeError: 'int' object has no attribute 'encode'を得る。つまり、どのような種類の型か、それをどのように変換するかを調べるために、何らかのif文を使用する必要があるということです。しかし、いつ.encode('utf-8')を使用し、str()をいつ使うべきですか?

私はこれについて何らかの種類のオンライナーをやることができればさらに良いだろうが、どうすればいいのだろうか?他の誰かが知っていますか?すべてのヒントは大歓迎です!

+1

は「生産参照してください

  • エンコード後半
    1. デコード早期
    2. ユニコード:だけにしてください文字列"?おそらく、結果は元のオブジェクトを何らかの形で表しているはずですが、文字列がどのように生成されるかは重要です。 – user2357112

    +0

    @ user2357112 - 主にロギングの目的で使用されているため、それがどれくらい近いかはあまり関係ありません。 – kramer65

    +0

    あなたのリストをとり、それを印刷してみませんか? – user2357112

    答えて

    6

    Python 2.xは、repr()を使用します。 Pythonの3.xの使用repr()あなたはその結果に非ASCII Unicodeを気にしない場合、またはascii()あなたが行う場合:

    >>> a=1    # integer 
    >>> class X: pass 
    ... 
    >>> x=X()   # class 
    >>> y='\u5000'  # Unicode string 
    >>> z=b'\xa0'  # non-ASCII byte string 
    >>> ' '.join(ascii(i) for i in (a,x,y,z)) 
    "1 <__main__.X object at 0x0000000002974B38> '\\u5000' b'\\xa0'" 
    

    2.Xおよび3.X repr()間の違いの例、および3.X ascii()

    >>> # Python 3 
    >>> s = 'pingüino' # Unicode string 
    >>> s 
    'pingüino' 
    >>> repr(s) 
    "'pingüino'" 
    >>> print(repr(s)) 
    'pingüino' 
    >>> ascii(s) 
    "'ping\\xfcino'" 
    >>> print(ascii(s)) 
    'ping\xfcino'  
    
    >>> # Python 2 
    >>> s = u'pingüino' 
    >>> s 
    u'ping\xfcino' 
    >>> repr(s) 
    "u'ping\\xfcino'" 
    >>> print(repr(s)) 
    u'ping\xfcino' 
    
    +0

    'repr()'のdocstringから明確にするため、オブジェクトの標準文字列表現を返します。コンソールに印刷するものは何でも想像してください。クラス参照、リスト、または何か他のものであれば、それは文字列になります。 – Reti43

    +0

    この 'ascii()'関数はどこから得られますか?私が '' ascii( 'something')しようとすると、 'NameError:name 'ascii' not defined'が出ます。私はそれをインポートしてそれを検索しようとしましたが、私はそのような関数の言及を見つけることができません。それ以上のヒント? – kramer65

    +0

    @ kramer65、 'ascii()'はPython 3.xのみです。 Python 2.xでは 'repr()'のように動作します。 Python 3.xの 'repr()'は、出力エンコーディングでサポートされている場合にはASCII以外の印刷可能な文字を表示するので、英語以外の言語でも出力を読みやすくなります。 –

    0

    現在のワンライナーと組み合わせることができます。またjoinはジェネレータでうまく動作しますので、リストを作成する必要はありません。

    ' '.join(x.encode('utf-8') if isinstance(x, basestring) else str(x) 
         for x in the_list) 
    
    1

    ような何かあなたが...代わりにUnicodeオブジェクトでINGの

    u' '.join(unicode(x) for x in thelist) 
    

    または何のpython3で正常に動作します前に、あなたが持っていたのjoinを試すことができます。どこでもより多くの詳細は別に、あなたはこの変換がしたい何this talk

    +0

    'unicode( 'ü')'が 'UnicodeDecodeError: 'ascii'コーデックでは、位置0のバイト0xc3をデコードできません:序数は範囲(128)にありません。他のアイデア? – kramer65

    +0

    あなたのソースファイルのエンコーディングを指定するとうまくいきます。 –

    +0

    '# - * - coding:utf-8 - * - 'と 'print unicode( 'ü')という2行のファイルを実行しようとしました。 ''しかし、私はまだ 'UnicodeDecodeError'を取得します。 – kramer65

    関連する問題