2017-08-24 4 views
0

"許容されない文字に対処しています#x0095:特殊文字は" YAML形式をPythonディクショナリオブジェクトに転送すると、位置25 "のエラーメッセージが表示されます。
可能な解決策は何ですか? "受け入れられない文字#x0095:特殊文字は" <unicode string> "、位置268" Pythonでのエラーyaml.load

d = 'tended (Journaled)"\n - "\x95 Support plug and play"\n' 
a = yaml.load(d) 

転送する文字列

はなく、適切なYAMLフォーマットを簡略されたが、私はそれが、この場合には無関係だと思います。 私はPython3を使用しています

+0

のUnicodeコードポイントの六角95は、Unicodeの制御文字です。 https://en.wikipedia.org/wiki/Unicode_control_charactersを参照してください - 表示したい文字はありますか? – Arminius

+0

文字列を表示することは私の目的ではありません。わかりやすいデータを分析可能なPython形式に整理しようとしています...このエラーメッセージを避けるためにyaml.load()を実行する前に私ができるコマンドやエンコーディングは? –

答えて

0

YAML specificationは、YAMLストリームがUnicode文字セットの印刷可能なサブセットのみを使用していることを明確に述べています。 NEL(\x85)を除いて、C1制御ブロック内の文字は、(つまり、文字は\x80-)であることは許可されていません。

これは、ほとんど有効なYAMLです:私はわからないが、ジャーナルが正しいかどうか(

d = '"tended (Journaled)":\n - " Support plug and play"\n' 

d = 'tended (Journaled)"\n - " Support plug and play"\n' 

あなただけのキーの後に、それの前に":を必要とします英語)

以下はYAMLではありません:

d = '"tended (Journaled)":\n - "\x95 Support plug and play"\n' 

\x95がC1制御ブロックに含まれているためです。これらの文字を手作業で置き換えるか、ドロップする必要があります。

は、あなたがそのような不正な文字を変換することができますruamel.yamlにはあまりありませんが、あなたは不正な文字をスキャンするReaderの不正な文字の正規表現を使用し、それらをドロップすることができます与える

from ruamel.yaml import YAML 
from ruamel.yaml.reader import Reader 

yaml = YAML(typ='safe') 


def strip_invalid(s): 
    res = '' 
    for x in s: 
     if Reader.NON_PRINTABLE.match(x): 
      # res += '\\x{:x}'.format(ord(x)) 
      continue 
     res += x 
    return res 

d = '"tended (Journaled)":\n - "\x95 Support plug and play"\n' 

print(yaml.load(strip_invalid(d))) 

{'tended (Journaled)': [' Support plug and play']} 

これ以上の手作業による介入はありません。あなたは

 # res += '\\x{:x}'.format(ord(x)) 

は、あなたが出力として取得する行コメントを解除した場合

{'tended (Journaled)': ['\x95 Support plug and play']} 
+0

これは私の問題を解決するだろう!どうもありがとう! –

0

無効な文字については、乱雑なデータをチェックする必要があります。

import yaml 

try: 
    d = 'tended (Journaled)"\n - "\x95 Support plug and play"\n' 
    a = yaml.load(d) 
except yaml.YAMLError as e: 
    print("Parsing YAML string failed") 
    print("Reason:", e.reason) 
    print("At position: {0} with encoding {1}".format(e.position, e.encoding)) 
    print("Invalid char code:", e.character) 

あなたはこのコードを実行した場合、それはあなたのキャラクター\x95が犯人であることを正確に表示します。幸いなことに、YAMLリーダーは、必要なデータを生成する例外があります。これで、例外がスローされなくなるまで/ repair /ユーザに尋ねる必要があります。

+0

コードを実行しながら\ x95をそのまま残す方法はありますか? –