Удалить запись из файла JSON

#python #json

Вопрос:

Пытаюсь удалить записи из файла JSON, но не могу заставить его работать.

Файл JSON выглядит следующим образом;

 [
  {
    "productName": "PlayStation 4",
    "productPrice": "129.5",
    "productUrl": "productUrl.com",
    "trackingUrl": "trackUrl.com",
    "currency": "EUR",
    "programId": 10627777,
    "approvalStatus": 1,
    "ean": "0711719215",
    "sku": "abc123",
    "extraInfo": [
      {
        "key": "color",
        "value": "red"
      }
    ],
    "imageUrl": "store/product_acb.png",
    "inStock": true,
    "manufacturer": "Sony",
    "manufacturerArticleNumber": "1245678",
    "market": "SE",
    "oldPrice": 45,
    "productCategory": "Consoles",
    "productDescription": "PlayStation 4 redefines rich and immersive gameplay with 
     powerful graphics and speed.",
    "shipping": 9
  },
  {
    "productName": "Macbook Pro",
    "productPrice": "1400",
    "productUrl": "site/store/product_acb",
    "trackingUrl": "trackUrl",
    "currency": "EUR",
    "programId": 1062777,
    "approvalStatus": 1,
    "ean": "0711719215",
    "sku": "abc123",
    "extraInfo": [
      {
        "key": "color",
        "value": "silver"
      }
    ],
    "imageUrl": "imgurl.com",
    "inStock": true,
    "manufacturer": "Apple",
    "manufacturerArticleNumber": "12345678",
    "market": "SE",
    "oldPrice": 45,
    "productCategory": "Laptops",
    "productDescription": "The best Macbook yet.",
    "shipping": 6
  }
]
 

Что я хочу сделать, так это удалить всю запись, если она соответствует одной из категорий, внесенных в черный список.

Файл, с которым я работаю;

 import requests


blacklisted_categories = [
    'Laptops'
]

r = requests.post(JSON API response)



def trim_json():
    for resource in r.json():
        if any(ele in resource["productCategory"] for ele in blacklisted_categories):
            del resource

 

Фильтрация категорий работает, но del resource не работает. Я использую неправильный синтаксис или вы видите какую-либо другую проблему?

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

1. Вы хотите «удалить» из списка, который не работает таким образом. Удаление элементов из списка обходится дорого. Просто создайте новый, с помощью понимания списка, без элементов черного списка.

Ответ №1:

Я бы просто создал новый список, содержащий все записи, которые не занесены в черный список.

 import requests

blacklisted_categories = [
    'Laptops'
]

records = requests.post("JSON API URL").json()
new_records = [r for r in records if r['productCategory'] not in blacklisted_categories]
 

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

1. Работает как волшебство! Застрял с моей функцией фильтра, так как [«Категория продукта»] включала подкатегории в значение. Например, «Ноутбуки — сенсорный экран — 15 дюймов». В любом случае, спасибо вам!

2. @Jonas Take-away: Вот почему важно, чтобы в вашем вопросе были примеры кода, соответствующие вашей реальной ситуации.

Ответ №2:

Вы можете использовать filter :

 filter(lambda x: x['productCategory'] == 'Laptops', r)
 

 r = [{"productName": "PlayStation 4", "productPrice": "129.5", "productUrl": "productUrl.com", "trackingUrl": "trackUrl.com", "currency": "EUR", "programId": 10627777, "approvalStatus": 1, "ean": "0711719215", "sku": "abc123", "extraInfo": [{"key": "color", "value": "red"} ], "imageUrl": "store/product_acb.png", "inStock": True, "manufacturer": "Sony", "manufacturerArticleNumber": "1245678", "market": "SE", "oldPrice": 45, "productCategory": "Consoles", "productDescription": "PlayStation 4 redefines rich and immersive gameplay with powerful graphics and speed.", "shipping": 9 }, {"productName": "Macbook Pro", "productPrice": "1400", "productUrl": "site/store/product_acb", "trackingUrl": "trackUrl", "currency": "EUR", "programId": 1062777, "approvalStatus": 1, "ean": "0711719215", "sku": "abc123", "extraInfo": [{"key": "color", "value": "silver"} ], "imageUrl": "imgurl.com", "inStock": True, "manufacturer": "Apple", "manufacturerArticleNumber": "12345678", "market": "SE", "oldPrice": 45, "productCategory": "Laptops", "productDescription": "The best Macbook yet.", "shipping": 6 } ]

print(list(filter(lambda x: x['productCategory'] == 'Laptops', r)))
>> [{'productName': 'Macbook Pro', 'productPrice': '1400', 'productUrl': 'site/store/product_acb', 'trackingUrl': 'trackUrl', 'currency': 'EUR', 'programId': 1062777, 'approvalStatus': 1, 'ean': '0711719215', 'sku': 'abc123', 'extraInfo': [{'key': 'color', 'value': 'silver'}], 'imageUrl': 'imgurl.com', 'inStock': True, 'manufacturer': 'Apple', 'manufacturerArticleNumber': '12345678', 'market': 'SE', 'oldPrice': 45, 'productCategory': 'Laptops', 'productDescription': 'The best Macbook yet.', 'shipping': 6}]
 

Или, используя понимание списка:

 [a for a in r if a['productCategory'] != 'Laptops']