Скрытый питон OrderedDict к данным - PullRequest
0 голосов
/ 29 июня 2018

Моя запись, OrderedDict, выглядит так:

my_record = OrderedDict([ (u'FIR_ID', '111249'), (u'FIR_TYPE', 'ORG')])

Мне нужно загрузить это в базу данных, поэтому я хотел бы преобразовать набор данных в кадр данных, а затем в файл CSV, чтобы облегчить загрузку базы данных. Но когда я делаю type(my_record), я получаю:

<class 'pg.mod.results'>

, что означает, что это объект класса. Если бы он был типа collections.OrderedDict, я мог бы просто сделать DataFrame(my_record). Я использую Python 2.x. Что я могу конвертировать OrderedDict в DataFrame?

Редактировать

Благодаря коду nosklo, ошибки исчезли; заголовки столбцов есть, но значения отсутствуют. Я извлек 10 записей, которые выглядят так:

[<ravenpackapi.models.results.Result at 0x118caadd0>,
 <ravenpackapi.models.results.Result at 0x118caad90>,
 <ravenpackapi.models.results.Result at 0x118e1a950>,
...,  <ravenpackapi.models.results.Result at 0x118da8750>]

Затем csv.DictWriter () создает CSV с таким содержимым:

<Field: TIMESTAMP_UTC>,<Field: RP_STORY_ID>,<Field: RP_ENTITY_ID>,...,<Field: ENTITY_TYPE>,,,,,,,,,,,,,,,

, который выглядит как полный список ключей. И в конце файла есть много строк «,,,,», указывающих на отсутствие значений.

Обновление

Мой текущий код такой:

records = list(records)
with open('/Users/.../.../RP_test_5.txt', 'w') as f:
    cf = csv.DictWriter(f, 
        ravenpackapi.models.fields.ANALYTICS_FIELDS,
        extrasaction='ignore') 
    cf.writeheader()
    cf.writerows(r.data for r in records)

Поскольку значения отсутствуют, я попробовал:

for r in records: r.data

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

ravenpackapi.models.fields.ANALYTICS_FIELDS

дает мне

[<Field: TIMESTAMP_UTC>,
 <Field: RP_STORY_ID>,
 <Field: RP_ENTITY_ID>,
 <Field: ENTITY_TYPE>,...

, тогда как r.data from

for r in records: r.data

дает мне

 {u'RP_ENTITY_ID': u'91C82E',
 u'RP_POSITION_ID': None,
 u'RP_SOURCE_ID': u'C98333',
 u'RP_STORY_EVENT_COUNT': 17,
 u'RP_STORY_EVENT_INDEX': 5,
 u'RP_STORY_ID': u'54F16F66850FB15F838629FD0C41F1CD',
 u'SOURCE_NAME': u'Ticker Report',
 u'SUB_TYPE': None,
 u'TIMESTAMP_UTC': u'2018-06-30 00:03:10.457',...,}

в другом порядке, и / или клавиши по-разному отформатированы?

u'TIMESTAMP_UTC' против <Field: TIMESTAMP_UTC>

Это сработало

records = list(records)

for r in records: r.data

with open('/Users/.../RP_test_6.txt', 'w') as f:
    cf = csv.DictWriter(f, 
        r.data.keys(),
        extrasaction='ignore') 
    cf.writeheader()
    cf.writerows(r.data for r in records)

Я уверен, что есть лучшие способы, чем

for r in records: r.data

и

r.data.keys()

Идеи

1 Ответ

0 голосов
/ 29 июня 2018

Вы начинаете свой вопрос, говоря, что ваш объект - OrderedDict, но это не так. Это pg.mod.results!

Если это объект, похожий на dict, и вы хотите сохранить его в CSV-файл, вам вообще не нужно преобразовывать его в DataFrame, вы можете просто использовать класс csv.DictWriter, включенный в python:

records = list(records)

with open('myfile.csv', 'w') as f:
    cf = csv.DictWriter(f, records[0].keys()) 
    cf.writeheader()
    cf.writerows(records)

EDIT:

В комментариях ниже вы раскрыли, что на самом деле представляют собой эти объекты - они не являются OrderedDicts, и по неизвестной причине автор решил вернуть представление OrderedDict в методе __str__ объектов Result, что вот почему вы запутались.

На основании этого https://github.com/RavenPack/python-api/blob/e3c99f5eaab7819a2087565ce0859bfb956a45cc/ravenpackapi/models/results.py#L33 объект Result является пользовательским объектом, который содержит реальные данные в своем атрибуте .data. Затем вы можете использовать этот атрибут для преобразования:

with open('myfile.csv', 'w') as f:
    cf = csv.DictWriter(f, 
        ravenpackapi.models.fields.ANALYTICS_FIELDS,
        extrasaction='ignore') 
    cf.writeheader()
    cf.writerows(r.data for r in records)
...