YAML을 올바르게 구문 분석 할 수 없습니다.

조나스 숄리

파이썬에서 다음 YAML 데이터를 구문 분석합니다.

>>> import yaml
>>> yaml.load("""
... ---
... categories: {1: Yes, 2: No}
... increasing: [00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10]
... ...
... """)

그리고 이것을 출력으로 얻으십시오.

{'increasing': [0, 1, 2, 3, 4, 5, 6, 7, '08', '09', 10], 'categories': {1: True, 2: False}}
  • "예"및 "아니오"가 True 및 False로 변환되는 이유는 무엇입니까?
  • "08"과 "09"는 문자열로 구문 분석되는 반면 다른 숫자는 선행 0이 잘린 숫자로 구문 분석되는 이유는 무엇입니까?
안톤

에 대한 당신의 공제 0007자리, 잘립니다 올바르지 않습니다. 이들은 모두 8 진수 문자로, 선행 0및 그 자체로 해석됩니다.

진수 문자는 포함 할 수 없습니다로 8또는 아무것도하지만, 문자열 및 같은 당신의 YAML 파서로드를 할 수 없습니다.90809

이것은 실제로 YAML 1.2의 YAML 1.1남은 (역 호환성)입니다. 8 진수 는 다음으로 시작해야합니다.0o

YesNo같은로드 TrueFalseRESP. YAML-1.1-ishm이기도합니다. 1.2 사양은 더 이상 이러한 대안을 언급하지 않습니다. 해당 문자열을 인용하면 변환되지 않습니다.

다음 규칙을 추가하여 True / False에 대한 Yes / No / On / Off 변형을 허용하지 않는 리졸버를 비교적 쉽게 빌드 할 수 있습니다.

MyResolver.add_implicit_resolver(
    u'tag:yaml.org,2002:bool',
    re.compile(u'''^(?:true|True|TRUE|false|False|FALSE)$''', re.X),
    list(u'tTfF'))

또는 일반을 사용하고 Resolver적절한 시작 기호 항목을 삭제합니다.

import ruamel.yaml as yaml
from ruamel.yaml.resolver import Resolver

yaml_str = """\
categories: {1: Yes, 2: No}
"""

for ch in list(u'yYnNoO'):
    del Resolver.yaml_implicit_resolvers[ch]


data = yaml.load(yaml_str, Loader=yaml.Loader)
print(data)

제공합니다 :

{'categories': {1: 'Yes', 2: 'No'}}

0으로 시작하는 모든 숫자 전용 문자열을 일반 정수로 인식하도록 만드는 것은 그렇게 간단하지 않습니다. 왜냐하면 암시 적 해석기를 변경하고 int0으로 시작하는 문자열을 전달하면 구문 분석 문제가 발생하기 때문 08입니다. 8 진수 ¹ :

import re
import ruamel.yaml as yaml
from ruamel.yaml.reader import Reader
from ruamel.yaml.resolver import BaseResolver, Resolver
from ruamel.yaml.scanner import RoundTripScanner
from ruamel.yaml.parser_ import Parser
from ruamel.yaml.composer import Composer
from ruamel.yaml.constructor import RoundTripConstructor
from ruamel.yaml import RoundTripLoader
from ruamel.yaml.compat import to_str


yaml_str = """\
categories: {1: Yes, 2: No}
increasing: [00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 10]
"""


class MyResolver(BaseResolver):
    pass

MyResolver.add_implicit_resolver(
    u'tag:yaml.org,2002:bool',
    re.compile(u'''^(?:true|True|TRUE|false|False|FALSE)$''', re.X),
    list(u'tTfF'))

MyResolver.add_implicit_resolver(
    u'tag:yaml.org,2002:float',
    re.compile(u'''^(?:
     [-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+]?[0-9]+)?
    |[-+]?(?:[0-9][0-9_]*)(?:[eE][-+]?[0-9]+)
    |\\.[0-9_]+(?:[eE][-+][0-9]+)?
    |[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*
    |[-+]?\\.(?:inf|Inf|INF)
    |\\.(?:nan|NaN|NAN))$''', re.X),
    list(u'-+0123456789.'))

MyResolver.add_implicit_resolver(
    u'tag:yaml.org,2002:int',
    re.compile(u'''^(?:[-+]?0b[0-1_]+
    |[-+]?[0-9]+
    |[-+]?0o?[0-7_]+
    |[-+]?(?:0|[1-9][0-9_]*)
    |[-+]?0x[0-9a-fA-F_]+
    |[-+]?[1-9][0-9_]*(?::[0-5]?[0-9])+)$''', re.X),
    list(u'-+0123456789'))

MyResolver.add_implicit_resolver(
    u'tag:yaml.org,2002:merge',
    re.compile(u'^(?:<<)$'),
    [u'<'])

MyResolver.add_implicit_resolver(
    u'tag:yaml.org,2002:null',
    re.compile(u'''^(?: ~
    |null|Null|NULL
    | )$''', re.X),
    [u'~', u'n', u'N', u''])

MyResolver.add_implicit_resolver(
    u'tag:yaml.org,2002:timestamp',
    re.compile(u'''^(?:[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]
    |[0-9][0-9][0-9][0-9] -[0-9][0-9]? -[0-9][0-9]?
    (?:[Tt]|[ \\t]+)[0-9][0-9]?
    :[0-9][0-9] :[0-9][0-9] (?:\\.[0-9]*)?
    (?:[ \\t]*(?:Z|[-+][0-9][0-9]?(?::[0-9][0-9])?))?)$''', re.X),
    list(u'0123456789'))

MyResolver.add_implicit_resolver(
    u'tag:yaml.org,2002:value',
    re.compile(u'^(?:=)$'),
    [u'='])

# The following resolver is only for documentation purposes. It cannot work
# because plain scalars cannot start with '!', '&', or '*'.
MyResolver.add_implicit_resolver(
    u'tag:yaml.org,2002:yaml',
    re.compile(u'^(?:!|&|\\*)$'),
    list(u'!&*'))


class MyRoundTripConstructor(RoundTripConstructor):
    def construct_yaml_int(self, node):
        value = to_str(self.construct_scalar(node))
        value = value.replace('_', '')
        sign = +1
        if value[0] == '-':
            sign = -1
        if value[0] in '+-':
            value = value[1:]
        if value == '0':
            return 0
        elif value.startswith('0b'):
            return sign*int(value[2:], 2)
        elif value.startswith('0x'):
            return sign*int(value[2:], 16)
        elif value.startswith('0o'):
            return sign*int(value[2:], 8)
        #elif value[0] == '0':
        #    return sign*int(value, 8)
        elif ':' in value:
            digits = [int(part) for part in value.split(':')]
            digits.reverse()
            base = 1
            value = 0
            for digit in digits:
                value += digit*base
                base *= 60
            return sign*value
        else:
            return sign*int(value)

MyRoundTripConstructor.add_constructor(
    u'tag:yaml.org,2002:int',
    MyRoundTripConstructor.construct_yaml_int)


class MyRoundTripLoader(Reader, RoundTripScanner, Parser,
                      Composer, MyRoundTripConstructor, MyResolver):
    def __init__(self, stream):
        Reader.__init__(self, stream)
        RoundTripScanner.__init__(self)
        Parser.__init__(self)
        Composer.__init__(self)
        MyRoundTripConstructor.__init__(self)
        MyResolver.__init__(self)

for ch in list(u'yYnNoO'):
    del Resolver.yaml_implicit_resolvers[ch]

data = yaml.load(yaml_str, Loader=MyRoundTripLoader)
print(data['increasing'])

그러면 다음과 같이 인쇄됩니다.

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

(또한 내부 조회 테이블에 인식 패턴을 먼저 삽입하지 않고 문자열로 예 / 아니오를 수행합니다.)


¹ 이를 위해 ruamel.yaml사용 했으며 그 중 내가 저자입니다. ruamel.yaml의 기반이되는 PyYAML은 유사한 파생을 지원할 수 있어야합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

WCF Post 요청 json 본문을 올바르게 구문 분석 할 수 없습니다.

분류에서Dev

파일을 올바르게 구문 분석 할 수 없습니다. Glob이 작동하지 않음

분류에서Dev

jquery-데이터를 올바르게 구문 분석 할 수 없습니다.

분류에서Dev

JSON 데이터를 올바르게 구문 분석 할 수 없습니다.

분류에서Dev

읽기 / 쓰기 스트림을 사용하여 이진 파일을 올바르게 구문 분석하고 다시 어셈블 할 수 없습니다.

분류에서Dev

컨테이너의 ReadItemAsync가 Stack <T> 인스턴스를 올바르게 구문 분석 할 수 없습니다.

분류에서Dev

nginx logwarn을 사용하여 특정 키워드가 포함 된 로그 줄을 올바르게 구문 분석 할 수 없습니다.

분류에서Dev

yaml 파일 파이썬을 구문 분석 할 수 없습니다.

분류에서Dev

자바 스크립트에서 JSON을 구문 분석 할 수 없습니다.

분류에서Dev

녹아웃 : 바인딩을 구문 분석 할 수 없습니다.

분류에서Dev

ajax에서 단일 게시물 값을 구문 분석 할 수 없습니다.

분류에서Dev

함수의 출력을 구문 분석 할 수 없습니다.

분류에서Dev

Pandas로 JSON 파일을 구문 분석 할 수 없습니다.

분류에서Dev

Moshi는 nullable을 구문 분석 할 수 없습니다.

분류에서Dev

HTMLCollection 목록을 구문 분석 할 수 없습니다.

분류에서Dev

ROBLOX Lua에서 JSON을 구문 분석 할 수 없습니다.

분류에서Dev

ROBLOX Lua에서 JSON을 구문 분석 할 수 없습니다.

분류에서Dev

Jackson은 List <Long>을 구문 분석 할 수 없습니다.

분류에서Dev

JSON을 구문 분석 할 수 없습니다.

분류에서Dev

JSON을 Javascript 개체로 구문 분석 할 수 없습니다.

분류에서Dev

JQuery가 JSP EL을 구문 분석 할 수 없습니다.

분류에서Dev

SwiftyJSON이 JSON 배열을 구문 분석 할 수 없습니다.

분류에서Dev

JAXB로 응답을 구문 분석 할 수 없습니다.

분류에서Dev

JSOUP- 상대 URL을 구문 분석 할 수 없습니다.

분류에서Dev

Logstash로 CSV 파일을 구문 분석 할 수 없습니다.

분류에서Dev

JSON REST API 응답을 구문 분석 할 수 없습니다.

분류에서Dev

JSON 응답을 구문 분석 할 수 없습니다.

분류에서Dev

cmake가 명령 줄 매개 변수의 공백을 올바르게 구문 분석하지 않습니다.

분류에서Dev

오류 : java.text.ParseException : 구문 분석 할 수없는 날짜, 날짜 형식을 올바르게 지정하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    WCF Post 요청 json 본문을 올바르게 구문 분석 할 수 없습니다.

  2. 2

    파일을 올바르게 구문 분석 할 수 없습니다. Glob이 작동하지 않음

  3. 3

    jquery-데이터를 올바르게 구문 분석 할 수 없습니다.

  4. 4

    JSON 데이터를 올바르게 구문 분석 할 수 없습니다.

  5. 5

    읽기 / 쓰기 스트림을 사용하여 이진 파일을 올바르게 구문 분석하고 다시 어셈블 할 수 없습니다.

  6. 6

    컨테이너의 ReadItemAsync가 Stack <T> 인스턴스를 올바르게 구문 분석 할 수 없습니다.

  7. 7

    nginx logwarn을 사용하여 특정 키워드가 포함 된 로그 줄을 올바르게 구문 분석 할 수 없습니다.

  8. 8

    yaml 파일 파이썬을 구문 분석 할 수 없습니다.

  9. 9

    자바 스크립트에서 JSON을 구문 분석 할 수 없습니다.

  10. 10

    녹아웃 : 바인딩을 구문 분석 할 수 없습니다.

  11. 11

    ajax에서 단일 게시물 값을 구문 분석 할 수 없습니다.

  12. 12

    함수의 출력을 구문 분석 할 수 없습니다.

  13. 13

    Pandas로 JSON 파일을 구문 분석 할 수 없습니다.

  14. 14

    Moshi는 nullable을 구문 분석 할 수 없습니다.

  15. 15

    HTMLCollection 목록을 구문 분석 할 수 없습니다.

  16. 16

    ROBLOX Lua에서 JSON을 구문 분석 할 수 없습니다.

  17. 17

    ROBLOX Lua에서 JSON을 구문 분석 할 수 없습니다.

  18. 18

    Jackson은 List <Long>을 구문 분석 할 수 없습니다.

  19. 19

    JSON을 구문 분석 할 수 없습니다.

  20. 20

    JSON을 Javascript 개체로 구문 분석 할 수 없습니다.

  21. 21

    JQuery가 JSP EL을 구문 분석 할 수 없습니다.

  22. 22

    SwiftyJSON이 JSON 배열을 구문 분석 할 수 없습니다.

  23. 23

    JAXB로 응답을 구문 분석 할 수 없습니다.

  24. 24

    JSOUP- 상대 URL을 구문 분석 할 수 없습니다.

  25. 25

    Logstash로 CSV 파일을 구문 분석 할 수 없습니다.

  26. 26

    JSON REST API 응답을 구문 분석 할 수 없습니다.

  27. 27

    JSON 응답을 구문 분석 할 수 없습니다.

  28. 28

    cmake가 명령 줄 매개 변수의 공백을 올바르게 구문 분석하지 않습니다.

  29. 29

    오류 : java.text.ParseException : 구문 분석 할 수없는 날짜, 날짜 형식을 올바르게 지정하는 방법은 무엇입니까?

뜨겁다태그

보관