Python YAML дампер одинарные и двойные кавычки выпуск - PullRequest
0 голосов
/ 04 декабря 2018

Я читаю строки из файла Excel и выгружаю их в файл YAML, после дампа я выяснил, что некоторые строки упоминаются в одинарных кавычках, двойных кавычках и в простом тексте.

Данные без каких-либо специальных символов создаются как простыеtext.
Данные с символом \ n и круглыми скобками создаются как «Данные здесь»
Данные со специальными символами создаются как «Данные здесь»

Я использую дампер yaml для создания файла YAML

with open(myprops['output'], "w") as f:
 ruamel.yaml.dump(doc,f, Dumper=ruamel.yaml.RoundTripDumper,default_flow_style=False)

Как представить все данные в одинарных кавычках - 'Data here'?

1 Ответ

0 голосов
/ 04 декабря 2018

Вы можете заставить дампер использовать одинарные кавычки, когда скаляр можно представить с помощью строк в одинарных кавычках, указав параметр default_style="'".

Это не гарантирует получение одинарных кавычек, хотя одинарные кавычкине может выполнить escape-последовательности, которые есть в двойных кавычках (т. е. они не похожи на Python), и некоторые значения могут по-прежнему получать двойные кавычки.

Использование нового API ruamel.yaml (где по умолчанию используется обратный дамп):

import sys
import ruamel.yaml

data = [
   "25",
   "with an\n embedded newline",
   "entry with single quote: (')",
   42
]

yaml = ruamel.yaml.YAML()
yaml.default_style = "'"
yaml.dump(data, sys.stdout)

, что дает:

- '25'
- "with an\n embedded newline"
- 'entry with single quote: ('')'
- !!int '42'

Обратите внимание, что для распознавания 42 как целого числа из-за кавычек скаляр должен быть помечен.То же самое относится и к другим специальным типам, которые может представлять YAML (float, booleans и т. Д.). Если вы не хотите, убедитесь, что все значения, которые вы сбрасываете, являются строками.

Вы также можете увидеть один механизм переходаСкаляры с одинарными кавычками в YAML имеют: так как одинарные кавычки в скаляре удваиваются.(И если бы он был в конце строки Python, у вас было бы три одинарных кавычки подряд в конце скаляра.

Если вы хотите согласованности в своем цитировании, вы должны использовать двойные кавычки,так как это может представлять все допустимые символы. Скаляры в одинарных кавычках в YAML могут занимать несколько строк, поэтому в принципе можно вставить новую строку. Но существуют ограничения на пробел вокруг новой строки.

Если у вас есть миксстроковых и нестроковых значений во ваших входных данных, и вы не хотите получать нестроковые кавычки, тогда вам нужно пройтись по структуре данных и заменить каждую строку x на ruamel.yaml.scalarstring.SingleQuotedScalarString(x), то естьвнутреннее представление, которое ruamel.yaml использует, если вы укажете yaml.preserve_quotes = True, чтобы отличать вводимые в одинарные кавычки от простых / двойных / буквальных / сложенных скаляров.

...