如何删除 .json 文件中的所有“$oid”和“$date”?
How to remove all the “$oid” and "$date" in a .json file?
我的计算机中保存了一个 .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
?
编辑:抱歉措辞不当,我想说的是是否可以在不记下字典中的每个键的情况下找到包含这些有问题的 $ 的键。实际上,有更多的文件有巨大的表格,其中很多都可以包含这个。
我会尝试如下所示的操作。
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'}
当您使用 bson.json_util.dumps()
的默认编码器时,会出现 $oid
和 $date
字段。
如果您可以控制这些文件的来源,您可能希望从源头上解决“问题”,而不必围绕它进行编码。以下代码片段显示了如何实现自定义编码器以按照您的需要格式化输出:
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"
}
我的计算机中保存了一个 .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
?
编辑:抱歉措辞不当,我想说的是是否可以在不记下字典中的每个键的情况下找到包含这些有问题的 $ 的键。实际上,有更多的文件有巨大的表格,其中很多都可以包含这个。
我会尝试如下所示的操作。
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'}
当您使用 bson.json_util.dumps()
的默认编码器时,会出现 $oid
和 $date
字段。
如果您可以控制这些文件的来源,您可能希望从源头上解决“问题”,而不必围绕它进行编码。以下代码片段显示了如何实现自定义编码器以按照您的需要格式化输出:
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"
}