Преобразование CSV в YAML, с Unicode?

Я пытаюсь преобразовать CSV-файл, содержащий строки Unicode, в файл YAML с использованием Python 3.4.

В настоящее время синтаксический анализатор YAML избегает моего текста в кодировке Unicode в строку ASCII. Я хочу, чтобы анализатор YAML экспортировал строку Unicode в виде строки Unicode без символов escape. Конечно, я что-то недопонимаю, и я был бы признателен за любую помощь.

Бонусные очки : как это можно сделать с Python 2.7?

Вход CSV

id, title_english, title_russian 1, A Title in English, Название на русском 2, Another Title, Другой Название 

текущий выход YAML

 - id: 1 title_english: A Title in English title_russian: "\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u043D\u0430\ \ \u0440\u0443\u0441\u0441\u043A\u043E\u043C" - id: 2 title_english: Another Title title_russian: "\u0414\u0440\u0443\u0433\u043E\u0439 \u041D\u0430\u0437\u0432\u0430\ \u043D\u0438\u0435" 

желаемый выход YAML

 - id: 1 title_english: A Title in English title_russian: Название на русском - id: 2 title_english: Another Title title_russian: Другой Название 

Код преобразования Python

 import csv import yaml in_file = open('csv_file.csv', "r") out_file = open('yaml_file.yaml', "w") items = [] def convert_to_yaml(line, counter): item = { 'id': counter, 'title_english': line[0], 'title_russian': line[1] } items.append(item) try: reader = csv.reader(in_file) next(reader) # skip headers for counter, line in enumerate(reader): convert_to_yaml(line, counter) out_file.write( yaml.dump(items, default_flow_style=False) ) finally: in_file.close() out_file.close() 

Благодаря!

2 Solutions collect form web for “Преобразование CSV в YAML, с Unicode?”

Я столкнулся с той же проблемой, и именно так я смог ее разрешить на основе вашего примера выше

 out_file.write(yaml.dump(items, default_flow_style=False,allow_unicode=True) ) 

включая allow_unicode=True исправляет проблему.

также специально для python2 используйте safe_dump вместо dump чтобы предотвратить отображение !!python/unicode вместе с текстом unicode.

 out_file.write(yaml.safe_dump(items, default_row_style=False,allow_unicode=True) 

В Python 2.x вы должны использовать Unicode CSV-считыватель, поскольку CSV-считыватель Python этого не поддерживает. Вы можете использовать unicodecsv для этой цели.

В вашем текущем коде Python 3.x вы должны явно передать кодировку файла при ее открытии:

 import csv with open('some.csv', newline='', encoding='utf-8') as f: reader = csv.reader(f) for row in reader: print(row) 

Возможно, ваша система уже делает правильные вещи, но в этом случае вы полагаетесь на значения по умолчанию.

Наконец, вам нужно убедиться, что файл YAML открыт с правильной кодировкой: open("yaml_file.yaml", "w", encoding="utf-8") . И эту кодировку следует использовать позже при чтении файла YAML.

Я не уверен, что yaml библиотека yaml при предоставлении объектов Python, но вам также нужно проверить, что line[0] и line[1] являются строками Unicode, когда вы устанавливаете их внутри convert_to_yaml .

  • Указание стилей для частей дампа PyYAML (II): последовательности
  • Любые библиотеки yaml в Python, которые поддерживают демпинг длинных строк в виде блочных литералов или сложенных блоков?
  • Сохранить SQL в YAML как есть
  • Статичные страницы Google App Engine для Python 2.5 и т. Д.
  • Добавление комментариев к YAML, созданных с помощью PyYaml
  • Отключить преобразование значения PyYAML
  • Есть ли способ построить объект, используя PyYAML construct_mapping после того, как все узлы завершат загрузку?
  • Как использовать пользовательскую проверку подлинности с атрибутом login: required в app.yaml (движок Google для приложений, python)
  • Python - лучший язык программирования в мире.