PyMongo-Python列表到MongoDB数据类型的转换

问题描述

我从请求中获取字符串格式的json响应,如下所示:

results = requests.request("POST",url,data=json.dumps(payload),headers=header).json()['product']

样本输出打印(结果)-对象类型= 列表'>

[
{
 'id': '123456','product': 'XYZ','exp_date': '03/01/2020','amount': '30.5','qty': '1'
},{
 'id': '789012','product': 'ABC','exp_date': '04/15/2020','amount': '22.57','qty': '3'
},{
 'id': '56789','product': 'AAA','exp_date': '03/29/2020','amount': '','qty': ' '
}
]

需要首先将所有这些字段转换为特定的数据类型,然后将其作为文档插入到MongoDB中。

  1. exp_date到日期/时间
  2. 金额为 float()
  3. 添加 int()
  4. 数量

什么是进行数据类型转换的有效方法

正在考虑是否可能出现如下所示的情况,还需要知道是否存在任何空,空或空字符串值,然后在数据类型转换期间如何用认值替换它?

new_result = []
for i in enumerate(results):
    i[exp_date] = datetime.strptime(i[exp_date],'%m/%d%Y').replace(hour=0,minute=0,second=0,microsecond=0)                         #check for empty/null/blank values and replace with default date
    new_result.append(i[exp_date])

for i in enumerate(results):
    i[amount] = float(i[amount])   #check for empty/null/blank values and replace with 0.00
    new_result.append(i[amount])

for i in enumerate(results):
    i[qty] = int(i[qty])           #check for empty/null/blank values and replace with 0
    new_result.append(i[qty])

db.collection.insert_many(new_result)

新列表输出应类似于: print(new_result)

[
{
 "id": "123456","product": "XYZ","exp_date": 2020-03-01 00:00:00,"amount": 30.5,"qty": 1
},{
 "id": "789012","product": "ABC","exp_date": 2020-04-15 00:00:00,"amount": 22.57,"qty": 3
},{
 "id": "56789","product": "AAA","exp_date": 2020-03-29 00:00:00,"amount": 0.0,"qty": 0
}
]

解决方法

您可以执行以下操作:

import datetime

input_lst = [
{
 "id": "123456","product": "XYZ","exp_date": "03/01/2020","amount": "30.5","qty": "1"
},{
 "id": "789012","product": "ABC","exp_date": "04/15/2020","amount": "22.57","qty": "3"
},{
 "id": "56789","product": "AAA","exp_date": "03/29/2020","amount": "","qty": " "
}
]

output_lst = []


for dct in input_lst:
    tmp_dct = dct.copy()
    # amount - float,qty - int4
    try:
        tmp_dct['amount'] = float(dct['amount'])
    except:
        pass

    try:
        tmp_dct['qty'] = int(dct['qty'])
    except:
        pass

    try:
        tmp_dct['exp_date'] = datetime.datetime.strptime(tmp_dct['exp_date'],'%m/%d/%Y').replace(hour=0,minute=0,second=0,microsecond=0)                         #check for empty/null/blank values and replace with default date
        output_lst.append(tmp_dct)
    except:
        pass


print(output_lst)

这效率更高,因为您只循环了一次。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...