将Python字典数据存储到csv中

时间:2016-01-27 15:36:09

标签: python facebook csv dictionary

我有一个存储Facebook状态数据的序列表(图谱API):

len(test_statuses)
3


test_statuses
[{u'comments': {u'data': [{u'created_time': u'2016-01-27T10:47:30+0000',
 u'from': {u'id': u'1755814687982070', u'name': u'Fadi Cool Panther'},
 u'id': u'447173898813933_447182555479734',
 u'message': u'Sidra Abrar'}],
 u'paging': {u'cursors': {u'after': u'WTI5dGJXVnVkRjlqZFhKemIzSTZORFEzTVRneU5UVTFORGM1TnpNME9qRTBOVE00T1RFMk5UQT0=',
 u'before': u'WTI5dGJXVnVkRjlqZFhKemIzSTZORFEzTVRneU5UVTFORGM1TnpNME9qRTBOVE00T1RFMk5UQT0='}},
u'summary': {u'can_comment': False,
u'order': u'ranked',
u'total_count': 1}},
u'created_time': u'2016-01-27T10:16:56+0000',
u'id': u'5842136044_10153381090881045',
u'likes': {u'data': [{u'id': u'729038357232696'},
{u'id': u'547422955417520'},
{u'id': u'422351987958296'},
{u'id': u'536057309903473'},
{u'id': u'206846772999449'},
{u'id': u'1671329739783719'},
{u'id': u'991398107599340'},
{u'id': u'208751836138231'},
{u'id': u'491047841097510'},
{u'id': u'664580270350825'}],
u'paging': {u'cursors': {u'after': u'NjY0NTgwMjcwMzUwODI1',
 u'before': u'NzI5MDM4MzU3MjMyNjk2'},
u'next': u'https://graph.facebook.com/v2.5/5842136044_10153381090881045/likes?limit=10&summary=true&access_token=521971961312518|121ca7ef750debf4c51d1388cf25ead4&after=NjY0NTgwMjcwMzUwODI1'},
u'summary': {u'can_like': False, u'has_liked': False, u'total_count': 13}},
u'link': u'https://www.facebook.com/ukbhangrasongs/videos/447173898813933/',
u'message': u'Track : Ik Waar ( Official Music Video )\nSinger : Falak shabir ft DJ Shadow\nMusic by Dj Shadow\nFor more : UK Bhangra Songs',
u'shares': {u'count': 7},
u'type': u'video'},
{u'comments': {u'data': [],
u'summary': {u'can_comment': False,
u'order': u'chronological',
u'total_count': 0}},
u'created_time': u'2016-01-27T06:15:40+0000',
u'id': u'5842136044_10153380831261045',
u'likes': {u'data': [],
u'summary': {u'can_like': False, u'has_liked': False, u'total_count': 0}},
u'message': u'I want to work with you. tracks for flicks',
u'type': u'status'}]

我需要在状态下提取每个状态文本和每个评论的文本,我可以将它们添加到单独的列表中,例如:

status_text = []
comment_text = []

for s in test_statuses:
try:
    status_text.append(s['message'])
    for c in s['comments']['data']:
        comment_text.append(c['message'])
except:
    continue

这为我提供了两个不同长度的列表len(status_text) = 2len(comment_text) = 49

不幸的是,这是一种处理数据的可怕方式,因为我无法跟踪哪些评论属于什么状态。理想情况下,我想将其存储为树结构并导出到cvs文件中,但我无法弄清楚如何操作。

可能的数据acv数据结构:

    Text        is_comment

 status1                 0
 status2                 0
 statusN                 0
comment1           status1
comment2           status1
commentN           statusN

1 个答案:

答案 0 :(得分:2)

为什么你需要这个以CSV格式?它已经结构化,可以像JSON一样持久化。

如果您确实需要CSV提供的表格方法,那么您必须对其进行非规范化,或者使用多个CSV表来引用彼此(同样,最好的方法是将数据放入SQL数据库,负责处理你的关系)

也就是说,反规范化的方法只是将相同的状态文本保存到注释所在的每一行 - 即:用你的方法在最里面的循环中记录CSV行:

import csv
status_text = []
comment_text = []
writer = csv.writer(open("mycsv.csv", "wt"))
for s in test_statuses:

    test_messages.append(s['message'])
    for c in s['comments']['data']:
        test_comments.append(c['message'])
        writer.writerow((s['message'], c['message']))

请注意,将状态id写入每一行可能会更好,并创建第二个表,其中包含id为关键字的状态消息(并将其放入其中)数据库而不是各种CSV文件)。然后,再次,你可能更好的只是保持JSON。如果您需要搜索功能,请使用支持JSON的数据库,例如MongoDB或PostgreSQL