Saya memiliki file json dalam format berikut. Yang perlu saya lakukan adalah menyingkirkan seluruh kamus elemen di mana "URI" tidak mengandung "http"

[
{
    "Exchange Name": "Standard & Poor's Indices",
    "Number": 33.0,
    "URI": "http://us.spindices.com/documents/additional-material/spdji-fixed-income-calendar-2016.xlsx",
    "ref_id": "33_Standard_&_Poor's_Indices"
},
{
    "Exchange Name": "ISE Mercury",
    "Number": 36.0,
    "URI": "follow OPRA",
    "ref_id": "36_ISE_Mercury"
},
{
    "Exchange Name": "Aequitas Neo",
    "Number": 37.0,
    "URI": "email for holidays",
    "ref_id": "37_Aequitas_Neo"
},
{
    "Exchange Name": "FINRA SPDS 144A",
    "Number": 38.0,
    "URI": "https://www.finra.org/industry/trace/trace-holiday-calendar",
    "ref_id": "38_FINRA_SPDS_144A"
}
]

Sejauh ini saya terjebak dengan fungsi berikut. Di sini masalahnya adalah remove() sebenarnya tidak menghapus elemen 'URI' dari string. Tetapi setelah saya menjalankan kode untuk kedua kalinya, itu berhasil. Saya pikir saya perlu menggunakan loop sementara untuk ini, tetapi bagaimana cara menerapkannya dalam pengaturan ini.

def sys_validate_data():
    with open('./data_out/uniq_set.json') as jf:
        json_decoded = json.load(jf)
        for ix in json_decoded:
            if "http" not in ix["URI"]:
                json_decoded.remove(ix)

        with open('./data_out/uniq_set.json', 'w') as fpw:
            json.dump(list(json_decoded), fpw, sort_keys=True, indent=4)
0
katiepy 8 Agustus 2017, 19:02

2 jawaban

Jawaban Terbaik

Jangan mengubah daftar saat mengulanginya. Melakukannya dapat menghasilkan perilaku yang tidak terduga. Sebagai gantinya, Anda dapat menggunakan pemahaman daftar untuk memfilter elemen dari daftar JSON Anda:

def sys_validate_data():
    with open('./data_out/uniq_set.json') as jf:
        json_decoded = [ix for ix in json.load(jf) if "http" in ix["URI"]]
        ....
2
Christian Dean 8 Agustus 2017, 16:06

Gunakan pemahaman daftar dan jangan ubah daftar saat mengulangi:

validated_json = [entry for entry in json_decoded if entry['URI'].startswith('http')]

Contoh yang diperluas:

def sys_validate_data():
    with open('./data_out/uniq_set.json') as jf:
        json_decoded = json.load(jf)
        validated_json = [entry for entry in json_decoded if entry['URI'].startswith('http')]

        with open('./data_out/uniq_set.json', 'w') as fpw:
            json.dump(validated_json, fpw, sort_keys=True, indent=4)
1
Igle 8 Agustus 2017, 16:10