【问题标题】:PyMongo - Python List to MongoDB datatype conversionPyMongo - Python 列表到 MongoDB 数据类型的转换
【发布时间】:2020-08-28 20:06:48
【问题描述】:

我从以下请求中得到字符串格式的 json 响应:

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

示例输出: print(results) - 对象类型 = list'>

[
{
 '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()

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

正在考虑是否有可能像下面这样,还需要知道是否有任何空、空或空白字符串值,那么在数据类型转换期间如何将其替换为一些默认值?

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
}
]

【问题讨论】:

    标签: python mongodb type-conversion pymongo string-to-datetime


    【解决方案1】:

    你可以这样做:

    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)
    

    这样更有效,因为您只循环一次。

    【讨论】:

    • 好的。另外,如何检查字符串中的空/空白/空格(金额,日期,数量)并在进行类型转换时默认它们?
    • 实际上是一个元组列表。因此,给出错误:- AttributeError: 'tuple' object has no attribute 'copy'。请建议
    • 请在您的问题中更改此项,因为目前它是错误的。请提供示例输入。
    • 顺便说一句,如果你有一个像:(title=1)这样的元组,或者类似的东西,你可以通过以下方式访问title的值:tuple_var_name.title
    • 更改了示例输入,即用单引号 (' ' ) 替换了 " " 双引号。实际上,API 响应还定义了一个 root_element('product'),我也在请求(发布)响应中更新了它。
    猜你喜欢
    • 2013-03-02
    • 2017-02-03
    • 2014-09-30
    • 2019-01-30
    • 2019-04-13
    • 2021-10-15
    • 1970-01-01
    • 2016-11-14
    • 2021-12-24
    相关资源
    最近更新 更多