从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"的名字。非常感谢
答案 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"]))