Принудительно интерпретировать строку как список? - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть объект данных, который был создан путем создания того, что я предполагаю, является объектом json -

jsonobj = {}
jsonobj["recordnum"] = callpri

и затем помещаю его в список, так как существует более одного из них -

myList = []
myList.append(jsonobj)

Затем это передается взад и вперед между подпрограммами фляги и шаблонами Jinja2, пока не закончится несколькими шагами позже, не перейдя к функции, где мне нужно получить доступ к этим данным, и это будет выглядеть примерно так-

techlist: [{'recordnum': '1', 'name': 'Person 1', 'phonenumber': '123-456-7890', 'email': 'person1@company.tld', 'maxnumtechs': 'ALL'}, {'recordnum': '2', 'name': 'Person 2', 'phonenumber': '098-765-4321', 'email': 'person2@company.tld', 'maxnumtechs': 'ALL'}, {'recordnum': '3', 'name': 'Person 3', 'phonenumber': '567-890-1234', 'email': 'person3@company.tld', 'maxnumtechs': 'ALL'}]

Я попытался заключить сделку с типом for tech in techlist: print(tech['recordnum']) и получил ошибку, поэтому я начал печатать типы для всего, и это все строки. for tech in techlist я думаю, просто разделив все это на слова, что, очевидно, совсем не то, что я хочу.

Я пытался возиться с json.loads в техническом списке, но он жаловался на ожидание записи вдвойные кавычки или что-то в этом роде. Я полностью озадачен, и был бы очень признателен, если бы кто-нибудь мог подсказать мне, как превратить эту строку обратно в список dicts или в список объектов json, или во что бы то ни стало, чтобы я мог перебирать элементы и получать доступконкретные поля.

Ответ на комментарии о том, как он работает правильно:

Для меня это выглядит как строка, и я думаю, что для вас двоих это работает, вы создаете его как список, так что он будет работать правильно ... к сожалению, это моя проблема, это строка, а не список, поэтому он делает это -

(env) [me@box directory]$ cat test.py
techlist = "[{'recordnum': '1', 'name': 'Person 1', 'phonenumber': '123-456-7890', 'email': 'person1@company.tld', 'maxnumtechs': 'ALL'}, {'recordnum': '2', 'name': 'Person 2', 'phonenumber': '098-765-4321', 'email': 'person2@company.tld', 'maxnumtechs': 'ALL'}, {'recordnum': '3', 'name': 'Person 3', 'phonenumber': '567-890-1234', 'email': 'person3@company.tld', 'maxnumtechs': 'ALL'}]"

print(type(techlist))

for tech in techlist:
  print(type(tech))
  print(str(tech))
(env) [me@box directory]$
(env) [me@box directory]$
(env) [me@box directory]$ python test.py
<class 'str'>
<class 'str'>
[
<class 'str'>
{
<class 'str'>
'
<class 'str'>
r
<class 'str'>
e
<snip>

Обновление:

Комментарий Трентона МакКинни сработал ОТЛИЧНО, СПАСИБО! Если вы так склонны, чтобы опубликовать его в качестве ответа, я приму это в качестве решения. Спасибо, спасибо, спасибо !!

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Преобразование строки обратно в dict:

from ast import literal_eval

techlist = """[{'recordnum': '1', 'name': 'Person 1', 'phonenumber': '123-456-7890', 'email': 'person1@company.tld', 'maxnumtechs': 'ALL'},
            {'recordnum': '2', 'name': 'Person 2', 'phonenumber': '098-765-4321', 'email': 'person2@company.tld', 'maxnumtechs': 'ALL'},
            {'recordnum': '3', 'name': 'Person 3', 'phonenumber': '567-890-1234', 'email': 'person3@company.tld', 'maxnumtechs': 'ALL'}]"""

print(type(techlist))

>>> <class 'str'>

techlist = literal_eval(techlist)

print(type(techlist))

>>> <class 'list'>

print(techlist)

# output

[{'email': 'person1@company.tld',
  'maxnumtechs': 'ALL',
  'name': 'Person 1',
  'phonenumber': '123-456-7890',
  'recordnum': '1'},
 {'email': 'person2@company.tld',
  'maxnumtechs': 'ALL',
  'name': 'Person 2',
  'phonenumber': '098-765-4321',
  'recordnum': '2'},
 {'email': 'person3@company.tld',
  'maxnumtechs': 'ALL',
  'name': 'Person 3',
  'phonenumber': '567-890-1234',
  'recordnum': '3'}]
1 голос
/ 06 ноября 2019

Верхний ответ касается строки, но вариант 3 касается работы со словарями с пандами

Вариант 1

from csv import reader
import pandas as pd
data=[str]
df=pd.DataFrame( list(reader(data)))
print(df)

results = df[col].to_list()

Вариант 2

В остальном просто разделить строку назначение

result = str.split(',')

Вариант 3 (я вполне уверен, что это то, что вы хотите):

df = pd.DataFrame(techlist)

results = df['recordnum'].to_list()

Надеюсь, один из этих ответов достаточно хорош, потому что ваш вопрос сбивает с толку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...