Как правильно читать JSON из CSV - PullRequest
0 голосов
/ 02 октября 2019

У меня есть фрейм данных с адресами свободной формы, которые я нормализую с помощью API Карт Google Geocoder. Результат возвращается в формате JSON, записывается в столбец и сохраняется в csv.

Однако, когда я читаю этот csv, в столбце с JSON появляются косые черты, поскольку столбец был прочитан из csv в виде строки, одиночнойкавычки появились в начале и в конце, а одиночные кавычки внутри json были экранированы с помощью обратной косой черты.

Так я получаю

json_address
'{\'status\': \'OK\'}'

Пока мне нужно

json_address
{'status': 'OK'}

Решение здесь не работает для меня, так как мой CSV читается в одинарных кавычках, и я получаю ошибку Expecting property name enclosed in double quotes

В дополнение к этому я не хочу нормализовать JSON ипоместите его в отдельные столбцы, я хочу вывод в виде словаря, указанного выше

Я пытался заменить одинарные кавычки на двойные

df['json_double'] = df['json_address'].apply(lambda x: x.replace("\'", "\""))

Это сработало, поэтому я получил

''{\''status\'': \'OK\''}''

Однако, когда я попробовал df['json'] = df['json_double'].apply(json.loads), я получил ошибку Expecting ',' delimiter: line 1 column 609 (char 608)

Так что мои вопросы:

  1. Как правильно обрабатывать JSON в будущем, чтобы избежать таких проблем?
  2. Как решить мою проблему? Меня интересует как решение на этапе чтения, так и на этапе преобразования столбца строки в json.

PS Пример всей строки, которую я хочу получить в качестве json, равен

* 1037. *

Применение json.loads к нему приводит к Expecting ',' delimiter: line 1 column 609 (char 608)

Получена следующая ошибка при попытке предложить решение enter image description here

1 Ответ

0 голосов
/ 02 октября 2019

Вы можете использовать метод literal_eval модуля ast , например:

import ast
mystr = '{\'results\': [{\'address_components\': [{\'long_name\': \'4\', \'short_name\': \'4\', \'types\': [\'street_number\']}, {\'long_name\': \'Ulitsa Marshala Rokossovskogo\', \'short_name\': \'Ulitsa Marshala Rokossovskogo\', \'types\': [\'route\']}, {\'long_name\': \'Nizhnij Novgorod\', \'short_name\': \'Nizhnij Novgorod\', \'types\': [\'locality\', \'political\']}, {\'long_name\': \'Sovetskiy\', \'short_name\': \'Sovetskiy\', \'types\': [\'administrative_area_level_3\', \'political\']}, {\'long_name\': \'Gorod Nizhniy Novgorod\', \'short_name\': \'Gorod Nizhniy Novgorod\', \'types\': [\'administrative_area_level_2\', \'political\']}, {\'long_name\': "Nizhegorodskaya oblast\'", \'short_name\': "Nizhegorodskaya oblast\'", \'types\': [\'administrative_area_level_1\', \'political\']}, {\'long_name\': \'Russia\', \'short_name\': \'RU\', \'types\': [\'country\', \'political\']}, {\'long_name\': \'603162\', \'short_name\': \'603162\', \'types\': [\'postal_code\']}], \'formatted_address\': "Ulitsa Marshala Rokossovskogo, 4, Nizhnij Novgorod, Nizhegorodskaya oblast\', Russia, 603162", \'geometry\': {\'location\': {\'lat\': 56.28278, \'lng\': 44.0456111}, \'location_type\': \'ROOFTOP\', \'viewport\': {\'northeast\': {\'lat\': 56.2841289802915, \'lng\': 44.0469600802915}, \'southwest\': {\'lat\': 56.2814310197085, \'lng\': 44.0442621197085}}}, \'place_id\': \'ChIJMeknJyXVUUERI9A8HCXBznI\', \'plus_code\': {\'compound_code\': \'72MW+46 Nizhny Novgorod, Nizhny Novgorod Oblast, Russia\', \'global_code\': \'9H8672MW+46\'}, \'types\': [\'street_address\']}], \'status\': \'OK\'}'
mydic = ast.literal_eval(mystr)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...