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']}
のUnicodeコードポイントの六角95は、Unicodeの制御文字です。 https://en.wikipedia.org/wiki/Unicode_control_charactersを参照してください - 表示したい文字はありますか? – Arminius
文字列を表示することは私の目的ではありません。わかりやすいデータを分析可能なPython形式に整理しようとしています...このエラーメッセージを避けるためにyaml.load()を実行する前に私ができるコマンドやエンコーディングは? –