我的记录,一个OrderedDict
,看起来像这样:
my_record = OrderedDict([ (u'FIR_ID', '111249'), (u'FIR_TYPE', 'ORG')])
我需要将其加载到数据库中,因此我希望将数据集转换为dataframe,然后再转换为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来自
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>
This worked
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()
想法?
发布于 2018-06-30 02:13:52
您可以这样开始您的问题:您的对象是一个OrderedDict
,但它不是。这是一个pg.mod.results
!
如果它是一个类dict的对象,并且你想将它存储到csv文件中,你根本不需要将它转换为DataFrame,你可以只使用python中包含的csv.DictWriter
类:
records = list(records)
with open('myfile.csv', 'w') as f:
cf = csv.DictWriter(f, records[0].keys())
cf.writeheader()
cf.writerows(records)
编辑:
在下面的评论中,你揭示了这些对象的真正含义--它们不是OrderedDicts,出于某种未知的原因,作者决定在Result
对象的__str__
方法中返回OrderedDict
的表示,这就是为什么你会感到困惑。
基于此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)
https://stackoverflow.com/questions/51107284
复制相似问题