【问题标题】:How to remove all the “$oid” and "$date" in a .json file?如何删除 .json 文件中的所有“$oid”和“$date”?
【发布时间】:2021-08-08 07:07:41
【问题描述】:

我的计算机中保存了一个 .json 文件,其中包含 $oid$date 之类的内容,这稍后会在 BigQuery 中给我带来麻烦。例如:

{
  "_id": {
  "$oid": "5e7511c45cb29ef48b8cfcff"
  },
  "about": "some text",
  "creationDate": {
  "$date": "2021-01-05T14:59:58.046Z"
  }
}

我希望它看起来像(所以它不只是从字符串中删除一些字母):

{
  "_id": "5e7511c45cb29ef48b8cfcff",
  "about": "some text",
  "creationDate": "2021-01-05T14:59:58.046Z"
}

使用 Pymongo,可以执行以下操作:

my_file['id']=my_file['id']['$oid']
my_file['creationDate']=my_file['creationDate']['$date']

如果不使用 Pymongo,这会怎样,因为我想先找到这样的键并删除所有有问题的 $oid$date

编辑:抱歉措辞不好,我的意思是是否有可能在不写下字典中的每个键的情况下找到包含这些有问题的 $ 的键。实际上,有更多包含大表的文件,其中许多可以包含这个。

【问题讨论】:

  • "我可以在不使用 Pymongo 的情况下执行此操作吗?或者使用 Pymongo 但处理我计算机中的文件?" 我相信你可以! (像“X 可能吗?”这样的问题不适合 Stack Overflow,因为软件开发中的答案几乎总是“是的,有足够的时间、金钱和资源”,并且更接近于为您编写代码的隐蔽请求,Stack Overflow 不会这样做。编辑您的问题以说明您解决此问题的尝试,并解释为什么这些不满足您的要求。How to Ask)

标签: python json database pymongo


【解决方案1】:

我会尝试如下所示的方法。

import json
file = open('data.json','r')
data = json.load(file)
for k,v in data.items():
    #check if key has dict value
    if type(v) == dict:
        #find id with $
        r = list(data[k].keys())[0]
        #change value if $ occurs
        if r[0] == '$':
            data[k] = data[k][r]
print(data)

似乎我们得到了这个输出。

{'_id': '5e7511c45cb29ef48b8cfcff', 'about': 'some text', 'creationDate': '2021-01-05T14:59:58.046Z'}

【讨论】:

  • 谢谢,我编辑了我的问题:“抱歉措辞不好,我的意思是是否有可能在不写下字典中的每个键的情况下找到包含这些有问题的 $ 的键就像我们在 Pymongo 中所做的那样。实际上,有更多包含巨大表格的文件,其中许多可以包含这个。”
【解决方案2】:

$oid$date 字段会在您使用默认编码器时出现 bson.json_util.dumps()

如果您可以控制这些文件的来源,您可能希望从源头解决“问题”,而不必围绕它编写代码。以下代码 sn-p 显示了如何实现自定义编码器以根据需要格式化输出:

import json
import datetime
from pymongo import MongoClient


class MyJsonEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, datetime.datetime):
            return obj.isoformat()
        if hasattr(obj, '__str__'):  # This will handle ObjectIds
            return str(obj)

        return super(MyJsonEncoder, self).default(obj)


db = MongoClient()['mydatabase']
db.mycollection.insert_one({'Date': datetime.datetime.now()})
record = db.mycollection.find_one()
print(json.dumps(record, indent=4, cls=MyJsonEncoder))

打印:

{
    "_id": "60a55e3cea5bf57c79177871",
    "Date": "2021-05-19T19:51:40.808000"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-24
    • 2020-02-21
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多