Загрузка 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 (чтобы я мог импортировать его в базу данных)

Однако, когда я пытаюсь записать данные 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

  • Возврат строчной строки ASCII из (возможно, кодированной) строки, извлеченной с использованием urllib2 или BeautifulSoup
  • Декодирование, если это не unicode
  • Проверка python, если строка utf-8 в верхнем регистре
  • Преобразование UTF-8 в строковые литералы в Python
  • Почему мы не должны использовать sys.setdefaultencoding («utf-8») в скрипте py?
  • Байты в строке юникода Python
  • Преобразование октетов UTF-8 в юникодные коды
  • Python Как исправить сломанную кодировку utf-8?
  • 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 не удалось для вас.

    Interesting Posts

    Проверьте, нет ли чего-то в списке в Python

    Python dict как создать ключ или добавить элемент к ключу?

    Загрузите и сохраните файл PDF с помощью модуля запросов Python

    Сохранять пробелы при использовании split () и join () в python

    Инструмент Python, который строит диаграмму зависимостей для методов класса

    Python – Как я могу поместить строку с пробелами справа и слева?

    Как вычислить производные с помощью Numpy?

    бесконечная рекурсия в наборе python3.3

    Как правильно вставить символы utf-8 в таблицу MySQL с помощью python

    генератор базового уровня python и список вопросов

    Есть ли лучший способ перебора двух списков, получая по одному элементу из каждого списка для каждой итерации?

    Получать пересекающиеся строки по двум массивам 2D numpy

    Получение расстояния между двумя точками на основе широты / долготы

    Как я могу сгенерировать все возможные IP-адреса из списка диапазонов ip в Python?

    Генерировать случайные целые числа от 0 до 9

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