sourcecode

JSON 개체에서 값을 삭제하려고 하면 "유니코드 개체는 항목 삭제를 지원하지 않습니다"라는 오류가 나타나는 이유는 무엇입니까?

codebag 2023. 3. 9. 22:02
반응형

JSON 개체에서 값을 삭제하려고 하면 "유니코드 개체는 항목 삭제를 지원하지 않습니다"라는 오류가 나타나는 이유는 무엇입니까?

각 객체에서 요소를 삭제하는 객체 목록을 루프하려고 합니다.각 오브젝트는 새로운 행입니다.그런 다음 오브젝트에 포함된 요소를 제외하고 새 파일을 그대로 저장하려고 합니다.

{
    "business_id": "fNGIbpazjTRdXgwRY_NIXA",
    "full_address": "1201 Washington Ave\nCarnegie, PA 15106",
    "hours": {
        "Monday": {
            "close": "23:00",
            "open": "11:00"
        },
        "Tuesday": {
            "close": "23:00",
            "open": "11:00"
        },
        "Friday": {
            "close": "23:00",
            "open": "11:00"
        },
        "Wednesday": {
            "close": "23:00",
            "open": "11:00"
        },
        "Thursday": {
            "close": "23:00",
            "open": "11:00"
        },
        "Saturday": {
            "close": "23:00",
            "open": "11:00"
        }
    },
    "open": true,
    "categories": ["Bars", "American (Traditional)", "Nightlife", "Lounges", "Restaurants"],
    "city": "Carnegie",
    "review_count": 7,
    "name": "Rocky's Lounge",
    "neighborhoods": [],
    "longitude": -80.0849416,
    "state": "PA",
    "stars": 4.0,
    "latitude": 40.3964688,
    "attributes": {
        "Alcohol": "full_bar",
        "Noise Level": "average",
        "Music": {
            "dj": false
        },
        "Attire": "casual",
        "Ambience": {
            "romantic": false,
            "intimate": false,
            "touristy": false,
            "hipster": false,
            "divey": false,
            "classy": false,
            "trendy": false,
            "upscale": false,
            "casual": false
        },
        "Good for Kids": true,
        "Wheelchair Accessible": true,
        "Good For Dancing": false,
        "Delivery": false,
        "Dogs Allowed": false,
        "Coat Check": false,
        "Smoking": "no",
        "Accepts Credit Cards": true,
        "Take-out": true,
        "Price Range": 1,
        "Outdoor Seating": false,
        "Takes Reservations": false,
        "Waiter Service": true,
        "Wi-Fi": "free",
        "Caters": false,
        "Good For": {
            "dessert": false,
            "latenight": false,
            "lunch": false,
            "dinner": false,
            "brunch": false,
            "breakfast": false
        },
        "Parking": {
            "garage": false,
            "street": false,
            "validated": false,
            "lot": true,
            "valet": false
        },
        "Has TV": true,
        "Good For Groups": true
    },
    "type": "business"
}

시간 요소 내에 포함된 정보를 제거해야 하지만 항상 동일한 정보는 아닙니다.일부에는 모든 요일이 포함되어 있고 일부에는 하루 또는 이틀의 정보만 포함되어 있습니다.

제가 시도한 코드는 다음과 같습니다.

import json

with open('data.json') as data_file:
    data = json.load(data_file)
    for element in data: 
        del element['hours']

다만, 코드 실행시에 에러가 표시됩니다.

TypeError: '유니코드' 개체가 항목 삭제를 지원하지 않습니다.

같은 파일을 덮어쓰려고 합니다.

import json

with open('data.json', 'r') as data_file:
    data = json.load(data_file)

for element in data:
    element.pop('hours', None)

with open('data.json', 'w') as data_file:
    data = json.dump(data, data_file)

dict.pop(<key>, not_found=None)제가 당신의 요구를 이해했다면 아마 당신이 찾고 있는 것이겠죠.이 기능을 사용하면hours키가 있으면 키를 누르고 키가 없으면 실패하지 않습니다.

다만, 키/값 쌍 전체를 삭제하고 싶을 뿐이므로, 시간 키에 일수가 포함되어 있는지 여부에 관계없이, 왜 다른지 이해할 수 없습니다.

이제, 만약 당신이 정말로 그것을 사용하고 싶다면del대신pop코드를 동작시키는 방법은 다음과 같습니다.

import json

with open('data.json') as data_file:
    data = json.load(data_file)

for element in data:
    if 'hours' in element:
        del element['hours']

with open('data.json', 'w') as data_file:
    data = json.dump(data, data_file)

다른 파일에 쓰려면 두 번째 파일에서 파일 이름을 변경하기만 하면 됩니다.open진술.

데이터 정리 단계에서 파일을 닫고 마지막에 덮어쓸 수 있도록 들여쓰기를 변경해야 했습니다.

with는 컨텍스트 매니저라고 불리는 것으로, 여기서 data_file 파일 기술자(descriptor)가 제공하는 것은 그 컨텍스트 내에서만 사용할 수 있습니다.그 말은, 그 안에 들어가자마자withblock ends, 파일이 닫히고 컨텍스트가 종료되며 파일 기술자가 비활성화/비활성화됩니다.

이렇게 하지 않으면 파일을 쓰기 모드로 열 수 없고 쓸 새 파일 설명자를 얻을 수 없습니다.

언급URL : https://stackoverflow.com/questions/36606930/why-do-i-get-an-error-unicode-object-does-not-support-item-deletion-when-try

반응형