Helpex - Trao đổi & giúp đỡ Đăng nhập

Cách tìm và thay thế một phần của giá trị trong tệp json

Phạm Diệu Anh
· 06:28 31/10/2018
04:58:13 15/06/2021

Tôi có một tệp json mà tôi đang sử dụng làm Từ điển trong python. Tệp json thực sự dài với hơn 10k bản ghi. Tôi cần thay phần $ home trong "iscategorical" bằng giá trị của "id". Sau khi thực hiện các thay đổi, tôi muốn lưu tệp này để có thể sử dụng lại nó làm từ điển. Cảm ơn bạn vì sự giúp đỡ. Đây là một mẫu:

{
"maps": [
    {
        "id": "xyzp",
        "iscategorical": "/u/$home/app/home"
    },
    {
        "id": "trtn",
        "iscategorical": "/u/app/$home/user"
    }
]}
9 hữu ích 3 bình luận 26k xem chia sẻ
Hồ Vĩnh Lộc
· 07:09 31/10/2018
07:09:51 31/10/2018

Tôi hiểu rằng bạn có thể tải tệp thành công và tất cả những gì bạn muốn làm là thay thế các chuỗi và lưu cấu trúc vào tệp một lần nữa.

Đối với điều này, chúng tôi có thể duyệt qua danh sách các từ điển trong dữ liệu và sửa đổi giá trị của item['iscategorical']bằng cách thay thế $homebằng giá trị của item['id'].

Sau đó, chúng ta có thể kết xuất cấu trúc đã sửa đổi trở lại tệp json (mới).

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

for item in data['maps']:
    item['iscategorical'] = item['iscategorical'].replace('$home', item['id'])

with open('new_data.json', 'w') as f:
    json.dump(data, f)
16 hữu ích 2 bình luận chia sẻ
Đặng Nhật Quân
· 07:10 31/10/2018
07:10:14 31/10/2018

Câu hỏi của bạn có vẻ tương tự như - Phân tích cú pháp các giá trị từ tệp JSON? . Tuy nhiên, đối với trường hợp của bạn, đoạn mã dưới đây sẽ hoạt động.

import json

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

for elem in data["maps"]:
  elem['iscategorical']=elem['iscategorical'].replace('$home',elem['id'])

with open('odata.json', 'w') as outfile:
    json.dump(data, outfile)
4 hữu ích 0 bình luận chia sẻ
Hồ Ngọc Châu
· 06:41 31/10/2018
06:41:50 31/10/2018

Nếu đó là một tệp, một điều bạn có thể làm là tải tệp vào và đọc từng dòng.

đối với mọi dòng, bạn có thể sử dụng regex để tìm và thay thế. Sau đó, bạn có thể ghi đè tệp hoặc ghi vào tệp mới.

Ví dụ,

line.replace('$home', 'id')

Ngoài ra, bạn có thể tải json python và chuyển đổi nó thành một chuỗi. Sau đó, thay thế văn bản bằng regex. Cuối cùng, chuyển đổi trở lại từ điển Python bằng json.load (). Tuy nhiên, dòng 10k là quá dài. Tôi nghĩ đọc từng dòng một, sẽ là một giải pháp tốt hơn.

CHỈNH SỬA: Đây là mẫu mã.

from tempfile import mkstemp
from shutil import move
from os import fdopen, remove

def replace(file_path, pattern, subst):
    #Create temp file
    fh, abs_path = mkstemp()
    with fdopen(fh,'w') as new_file:
        with open(file_path) as old_file:
            for line in old_file:
                new_file.write(line.replace(pattern, subst))
    #Remove original file
    remove(file_path)
    #Move new file
    move(abs_path, file_path)

replace('./text.txt', '$home', 'id')
1 hữu ích 0 bình luận chia sẻ
Trịnh Quý Vĩnh
· 09:55 31/10/2018
09:55:15 31/10/2018

"Tệp json thực sự dài với hơn 10k bản ghi" - Hãy thử theo cách này, nó sẽ hữu ích cho các tệp lớn.

  • input.json

{"maps": [{"id": "xyzp", "iscategorical": "/ u / $ home / app / home"}, {"id": "trtn", "iscategorical": "/ u / app / $ home / người dùng "}]}

import json
with open('input.json') as f:
    data = json.load(f)
my_list = []

def get_some_data():
    for item in data['maps']:
        yield(item['id'], item['iscategorical'])

for id, iscat in get_some_data():
    temp_dict = {}
    temp_dict['id'] = id
    temp_dict['iscategorical'] = iscat.replace('$home', id)
    my_list.append(temp_dict)

maps_dict = {}
maps_dict['maps'] = my_list
with open('output.json', 'w') as f:
    json.dump(maps_dict, f)
  • output.json:

{"maps": [{"id": "xyzp", "iscategorical": "/ u / xyzp / app / home"}, {"id": "trtn", "iscategorical": "/ u / app / trtn / user "}]}

0 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ python json python-3.x , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm