如何删除你的字母,只在python中显示sub fieild的值

时间:2016-10-26 16:29:07

标签: mongodb python-2.7 csv

从Mongodb将数据导出到csv时,如何删除CSV中的子字段,u字母和括号的名称?

工作流程集合示例:

 {
        "_id": ObjectID("54b98bca7c1f57d85021f308"),
        "requiredLanguages": [
            "en"
        ],
        "isDeleted": false,
        "name": {
            "en": "Test Workflow"
        },        
        "isEditable": false,
        "date": {
            "created": ISODate("2016-07-21T23:06:38.748Z")
        }
    }

如果我把'date.created'在python脚本中,它显示了我不想要的所有内容。

python 2.7脚本:

import csv
cursor = db.workflows.find( {}, {'_id': 1, 'requiredLanguages': 1, 'isDeleted': 1, 'name': 1, 'isEditable':1, 'date.created':1 })
with open ('workflows.csv', 'w') as outfile:
    fields = ['_id', 'requiredLanguages', 'isDeleted', 'name', 'isEditable', 'date']
    write = csv.DictWriter(outfile, fieldnames=fields)
    write.writeheader()
    for x in cursor:        
        write.writerow(x)

csv示例:

_id,requiredLanguages,isDeleted,name,isEditable,date
5318cbd9a377f52a6a0f671f,[u'en'],False,{u'en': u'Default Workflow'},False,"{u'created': datetime.datetime(2016, 7, 21, 23, 6, 38, 748000)}"
54b98bca7c1f57d85021f308,[u'en'],False,{u'en': u'Test Workflow'},False,"{u'created': datetime.datetime(2016, 7, 21, 23, 6, 38, 748000)}"

如果我改变日期'不同的名称,它没有用。 我希望得到&date;创建' date.created'。还怎么删除你的字母?有人可以帮我解决你删除你的字母以及" date.created"的名字。非常感谢

1 个答案:

答案 0 :(得分:3)

您的第一个问题是您需要决定如何处理多值字段。可以有几种必需的语言,那么它们如何在您的csv中表示?我的示例解决方案为lang创建逗号分隔列表,并为name选择主要语言,但您可能希望以不同方式对其进行建模。 DictWriter是一种方便的方法,我将其替换为自行构建行元组的自定义代码。

第二个问题是u字符串是unicode。您需要决定如何在csv中表示unicode数据。我实现了一个在utf-8中编码csv的解决方案。

您会注意到我的模拟数据集遗漏了一些您可能仍需要处理的细节,例如IOODate。

import csv
import codecs

# Mock for debug
#cursor = db.workflows.find( {}, {'_id': 1, 'requiredLanguages': 1, 'isDeleted': 1, 'name': 1, #'isEditable':1, 'date.created':1 })

cursor = [{
        "_id": "54b98bca7c1f57d85021f308",
        "requiredLanguages": [
            "en"
        ],
        "isDeleted": False,
        "name": {
            "en": "Test Workflow"
        },        
        "isEditable": False,
        "date": {
            "created": "2016-07-21T23:06:38.748Z"
        }
}]


with codecs.open('workflows.csv', 'w', encoding='utf-8') as outfile:
    fields = ['_id', 'requiredLanguages', 'isDeleted', 'name', 'isEditable', 'date']
    write = csv.writer(outfile)
    write.writerow(fields)
    for x in cursor:
        primary_lang = x["requiredLanguages"][0]
        write.writerow((x["_id"], u','.join(x["requiredLanguages"]),
            x["isDeleted"], x["name"][primary_lang], x["isEditable"],
            x["date"]["created"]))