Преобразование строки в dataframe-readable - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть много строк, подобных этой:

"[{'id': 10749, 'name': 'Romance'}, {'id': 35, 'name': 'Comedy'}]"

Но так как я работаю с фреймом данных, мне нужно преобразовать их в JSON (или так это выглядит по формату), поэтому Я могу получить доступ и сгладить данные. Любая идея о том, как этого можно достичь?

РЕДАКТИРОВАТЬ: я понял, что это не JSON, но я все еще не знаю, как преобразовать это в словарь или около того, чтобы манипулировать им.

Ответы [ 3 ]

2 голосов
/ 16 апреля 2020

Вы можете использовать ast.literal_eval:

import ast
x = ast.literal_eval("[{'id': 10749, 'name': 'Romance'}, {'id': 35, 'name': 'Comedy'}]")
x[0]["name"]  # evaluates to 'Romance'

Из документации:

Безопасное вычисление узла выражения или строки, содержащей Python буквальный или контейнерный дисплей. Предоставленная строка или узел могут состоять только из следующих Python литеральных структур: строк, байтов, чисел, кортежей, списков, диктов, наборов, логических значений и None.

Это можно использовать для безопасной оценки строк содержит Python значения из ненадежных источников без необходимости разбора значений самостоятельно. Он не способен вычислять произвольно сложные выражения, например, с использованием операторов или индексации.

0 голосов
/ 16 апреля 2020

Похоже, что данные почти в JSON, но я считаю, что двойные кавычки должны быть вокруг ключей словаря, в то время как одинарные кавычки должны быть вокруг всего объекта. Это можно исправить, выполнив:

data_string = "[{'id': 10749, 'name': 'Romance'}, {'id': 35, 'name': 'Comedy'}]"
json_string = data_string.replace("'", '''"''')

Теперь у вас есть строка JSON!

Если вам нужно преобразовать строку в python структуры, вы можете сделать следующее:

import json

data = json.loads(json_string)
print(data[0]['id']) # 10749
0 голосов
/ 16 апреля 2020

Поскольку это может быть потенциально повторяющейся задачей. Вероятно, это хорошая идея сделать из нее функцию.

import json  # Import json module to work with json data
import ast


data = "[{'id': 10749, 'name': 'Romance'}, {'id': 35, 'name': 'Comedy'}]"


def clean_data_for_json_loads(input_data):
    """Prepare data from untrusted sources for json formatting. 
    Output JSON object as string """
    evaluated_data = ast.literal_eval(input_data)
    json_object_as_string = json.dumps(evaluated_data)
    return json_object_as_string

evaluated_data = clean_data_for_json_loads(data)


# Load json data from a string, the (s) in loads stands for string. This helps to remember the difference to json.load
json_data = json.loads(evaluated_data)
print(json_data)
...