0

JSON 形式で urlopen を介してクエリを実行した後、文字列を受け取ります。

def get_clean_text(text):
    return text.translate(maketrans("!?,.;():", "        ")).lower().strip()

for track in json["tracks"]:
    print track["name"].lower()
    get_clean_text(track["name"].lower())

文字列「türlich、türlich(シッチャー、ディッカー)」の場合、次のようになります

ファイル「main.py」、23 行目、get_clean_text 内

return text.translate(maketrans("!?,.;():", "        ")).lower().strip()

TypeError: 文字マッピングは整数、None、または Unicode を返さなければなりません

文字列を「türlich türlich sicher dicker」にフォーマットしたいと思います。

4

1 に答える 1

0

質問は完全な自己完結型の例ではありません。Python 2か3か、どこmaketransから来たのかわからない。間違っていると思う可能性が高いので、質問に適切なタグを付けて、短く、自己完結型の正しい例を提供する必要があります。 。(それと、他のさまざまな人々(おそらく私より賢い人もいる)があなたの質問を曖昧だったので無視した可能性が高いという事実。)

2.xを使用していて、from string import *を取得maketransし、json["name"]str / bytesではなくUnicodeであると仮定すると、次の問題が発生します。

変換テーブルには、古いスタイルの8ビットテーブル(256文字の配列)と新しいスタイルのスパーステーブル(ある文字の序数を別の文字にマッピングするdict)の2種類があります。str.translate関数はどちらも使用できますが、2番目のみを使用できます(unicode.translate少し考えれば明らかな理由から)。

このstring.maketrans関数は、古いスタイルの8ビット変換テーブルを作成します。したがって、で使用することはできませんunicode.translate

次のように、ドロップイン置換として独自の「makeunitrans」関数をいつでも作成できます。

def makeunitrans(frm, to):
  return {ord(f):ord(t) for (f,t) in zip(frm, to)}

ただし、特定のキャラクターをマップしたいだけの場合は、もう少し特別な目的を実行できます。

def makeunitrans(frm):
  return {ord(f):ord(' ') for f in frm}

しかし、あなたの最後のコメントから、私はtranslateあなたが何を望んでいるかさえわかりません:

文字列を「türlichtürlichsicherdicker」にフォーマットしたい

これが正しければ、文字列を「türlichtürlichsicher dicker」にフォーマットします。これは、これらすべての句読文字をスペースにマッピングしているためです。

新しいスタイルの変換テーブルを使用すると、必要なものをNoneにマップでき、その問題が解決されます。translateただし、たとえば、複数回呼び出すのではなく、最初にメソッドを使用している理由を確認することをお勧めしますreplace(通常、「パフォーマンスのために」と言われますが、翻訳テーブルをインラインで作成することはありません。それが問題だった場合は毎回)または些細な正規表現を使用します。

于 2012-09-12T23:56:22.410 に答える