Загрузка Python UTF-8 JSON

У меня есть следующий JSON (для простоты я использую только один, но в действительности есть 100 записей):

{ "Active": false, "Book": "US Derivat. London, Mike Übersax/Michael Jealous", "ExpirationDate": "2006-10-12", "Isin": "CH0013096497", "IssueDate": "2001-10-09", "KbForXMonths": "0", "KbPeriodDay": "Period", "KbType": "Prozent", "KbYear": "0.5", "Keyinvest_IssueRetro": "0.50%", "Keyinvest_RecurringRetro": "1.00% pro rata temporis", "Keyinvest_RetroPayment": "Every month", "LastImportDate": "2008-12-31", "LiberierungDate": "1900-01-01", "NominalCcy": "USD", "NominalStueck": "5,000", "PrimaryCCR": "0", "QuoteType": "Nominal", "RealValor": "0", "Remarks": "", "RwbeProductId_CCR": "034900", "RwbeProductId_EFS": "034900", "SecName": "Cliquet GROI on Nasdaq", "SecType": "EQ", "SubscriptionEndDate": "1900-01-01", "TerminationDate": "2003-10-19", "TradingCcy": "USD", "Valor": 1309649 } 

Я пытаюсь прочитать этот JSON, чтобы сохранить его как .csv (чтобы я мог импортировать его в базу данных)

  • Запись в файл UTF-8 в Python
  • UTF-8 HTML и CSS-файлы с спецификацией (и как удалить спецификацию с Python)
  • Преобразование UTF-8 с спецификацией в UTF-8 без спецификации в Python
  • Удаление спецификации из gzip'ed CSV в Python
  • Однако, когда я пытаюсь записать данные JSON в виде csv, например:

     with codecs.open('EFSDUMP.csv', 'w', 'utf-8-sig') as csv_file: content_writer = csv.writer(csv_file, delimiter=',') content_writer.writerow(data.values()) 

    Я получаю сообщение об ошибке:

     UnicodeEncodeError: 'ascii' codec can't encode character u'\xdc' in position 25: ordinal not in range(128) 

    Это потому, что в JSON есть умляут (см. Атрибут «Книга»).

    Я пытаюсь прочитать JSON следующим образом:

     data = json.loads(open('EFSDUMP.json').read().decode('utf-8-sig')) 

    Что интересно, так это:

     print data 

    Дает мне это:

     {u'PrimaryCCR': u'0', u'SecType': u'EQ', u'Valor': 1309649, u'KbType': u'Prozent', u'Book': u'US Derivat. London, Mike \xdcbersax/Michael Jealous', u'Keyinvest_RecurringRetro': u'1.00% pro rata temporis', u'TerminationDate': u'2003-10-19', u'RwbeProductId_CCR': u'034900', u'SubscriptionEndDate': u'1900-01-01', u'ExpirationDate': u'2006-10-12', u'Keyinvest_RetroPayment': u'Every month', u'Keyinvest_IssueRetro': u'0.50%', u'QuoteType': u'Nominal', u'KbYear': u'0.5', u'LastImportDate': u'2008-12-31', u'Remarks': u'', u'RealValor': u'0', u'SecName': u'Cliquet GROI on Nasdaq', u'Active': False, u'KbPeriodDay': u'Period', u'Isin': u'CH0013096497', u'LiberierungDate': u'1900-01-01', u'IssueDate': u'2001-10-09', u'KbForXMonths': u'0', u'NominalCcy': u'USD', u'RwbeProductId_EFS': u'034900', u'TradingCcy': u'USD', u'NominalStueck': u'5,000'} 

    Очевидно, умлаут стал «\ xdc»

    Однако когда я это делаю:

     print data['Book'] 

    Значение Я получаю доступ к атрибуту напрямую, я получаю:

     US Derivat. London, Mike Übersax/Michael Jealous 

    Так умлаут снова является актуальным умлявто.

    Я уверен, что JSON является UTF-8 без спецификации (Notepad ++ утверждает, что так)

    Я уже пробовал все предложения здесь без каких-либо успехов: Python загружает json-файл с заголовком спецификации UTF-8

    Как я могу правильно прочитать файл JSON UTF-8, чтобы иметь возможность записать его как .csv?

    Любая помощь приветствуется.

    Версия для Python: 2.7.2

  • Как написать строку заголовка с помощью csv.DictWriter?
  • Запись списков Python в столбцы в csv
  • Конвейер для экспорта csv-файла в нужном формате
  • Кодек Python ASCII не может кодировать ошибку символа во время записи в CSV
  • Использование matplotlib Polycollection для построения данных из файлов csv
  • Как остановить мой повторный стоп, повторяя себя
  • One Solution collect form web for “Загрузка Python UTF-8 JSON”

    В Python 2 модуль csv не поддерживает запись Unicode. Здесь вам нужно закодировать его вручную, так как в противном случае ваши значения Юникода будут закодированы для вас с использованием ASCII (вот почему вы получили исключение для кодировки).

    Это также означает, что вам нужно писать спецификацию UTF-8 вручную, но только если вам это действительно нужно . UTF-8 можно записать только в одну сторону, для чтения файлов UTF-8 не требуется отметка байтового заказа. Microsoft любит добавлять его в файлы, чтобы облегчить задачу определения кодировок файлов для своих инструментов, но спецификация UTF-8 может фактически затруднить работу других инструментов, поскольку они не будут игнорировать дополнительный начальный символ.

    Использование:

     with open('EFSDUMP.csv', 'wb') as csv_file: csv_file.write(codecs.BOM_UTF8) content_writer = csv.writer(csv_file) content_writer.writerow([unicode(v).encode('utf8') for v in data.values()]) 

    Обратите внимание, что это будет записывать ваши значения в произвольном (словаре) порядке. Вызов unicode() будет преобразовывать нестроковые типы в строки unicode перед кодированием.

    Чтобы быть явным: вы правильно загрузили данные JSON. Это письмо CSV не удалось для вас.

    Python - лучший язык программирования в мире.