Преобразование PyMongo — списка Python в тип данных MongoDB

#python #mongodb #type-conversion #pymongo #string-to-datetime

#python #mongodb #преобразование типов #pymongo #преобразование строки в дату-время

Вопрос:

Я получаю ответ 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()

Каков эффективный способ преобразования типа данных?

Думал, возможно ли что-то вроде приведенного ниже, также необходимо знать, есть ли какие-либо пустые, нулевые или незаполненные строковые значения, тогда как заменить его некоторым значением по умолчанию во время преобразования типа данных?

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

Ответ №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)
  

Это более эффективно, потому что вы выполняете цикл только один раз.

Комментарии:

1. ОК. кроме того, как проверить наличие пустых / незаполненных / пробелов в строках (количество, дата, кол-во) и установить их по умолчанию при преобразовании типов?

2. На самом деле это список кортежей. Следовательно, выдает ошибку:- AttributeError: объект ‘tuple’ не имеет атрибута ‘copy’. Пожалуйста, предложите

3. Пожалуйста, измените это в своем вопросе, потому что в настоящее время это неверно. Пожалуйста, предоставьте пример ввода.

4. Кстати, если у вас есть кортеж типа: (title= 1) или что-то в этом роде, вы можете получить доступ к значению title с помощью: tuple_var_name.title

5. изменен пример ввода, т. Е. заменены двойные кавычки » » на одинарные (‘ ‘ ) кавычки. На самом деле, в ответе API также определен root_element (‘product’), который я также обновил в ответе на запрос (post).