【问题标题】:how to remove u letter and show the value of sub fieild only in python如何删除 u 字母并仅在 python 中显示子字段的值
【发布时间】:2016-10-26 16:29:07
【问题描述】:

从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.created”下的值。还有怎么去掉你的字母?有人可以帮我删除 u 字母和“date.created”的名称。非常感谢

【问题讨论】:

  • 您在requiredLanguages 字段中有一个列表,在name 中有一个dict。您需要弄清楚您希望它们如何出现在.csv 文件中,然后“flatten” 这些字段也是如此,因此它们在调用write.writerow(x) 之前显示为字符串,例如,对于listrequiredLanguages 字段)你可以看看这个:stackoverflow.com/questions/5618878/…
  • Python 2.x 我假设?你能添加一个额外的标签吗?
  • 我想获取 CSV 中出现的值,就像 _id,requiredLanguages,isDeleted,name,isEditable,date 5318cbd9a377f52a6a0f671f,en,False,'Default Workflow,False,2016, 7, 21, 23, 6, 38, 748000 我不需要 CSV 文件中出现的括号、引号、“en”、“{u'created': datetime.datetime”。

标签: mongodb python-2.7 csv


【解决方案1】:

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

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

您会注意到我的模拟数据集遗漏了一些您可能仍需要处理的细节,例如 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"]))

【讨论】:

  • 脚本有效。如何将光标更改为我自己的光标?我得到了很好的结果。请参阅以下 csv:_id,requiredLanguages,isDeleted,name,isEditable,date 54b98bca7c1f57d85021f308,en,False,Test Workflow,False,2016-07-21T23:06:38.748Z 这就是我想要的。我试图改变光标,但它不起作用。谢谢
  • 如果我从 with 子句中删除编解码器,它不起作用。我可以改为使用 open('workflows.csv', 'w', encoding='utf-8') 作为输出文件吗?
  • @user7070824 unicode 在 python 2.x 煮熟后被用螺栓固定在它上面,所以它的边缘很粗糙。 Python 2 的open 不支持编码,因此您需要使用codec 模块。 Python 3 的 open 确实支持编码。
  • 感谢您的解释。我将使用编解码器模块,CSV 的输出就是我想要的。我喜欢你的解决方案。我试图在其他集合上使用您的脚本,它没有给我正确的结果。如果你有时间,你能帮帮我吗?我将从 Mongodb 导入 CSV 到 Postgresql。
  • 我没有 mongodb 或 postgressql。我只能回答您的问题,因为您在发布示例数据方面做得很好。像我对你的下一个问题所做的那样做一些事情怎么样。从您的脚本中打印一些示例数据(例如,print(repr(next(cursor))) 并模拟您遇到问题的部分,以便没有其他工具的人可以运行它们。然后您可以将其发布到 stackoverflow。有一半的时间,您最终会弄清楚你去的问题。
猜你喜欢
  • 2017-03-21
  • 1970-01-01
  • 1970-01-01
  • 2020-07-19
  • 1970-01-01
  • 1970-01-01
  • 2020-02-14
  • 2019-06-21
  • 1970-01-01
相关资源
最近更新 更多