Hướng dẫn join two json files based on common key python - nối hai tệp json dựa trên python khóa chung

Đầu tiên, chúng ta hãy đưa những thứ JSON ra khỏi đường đi.

Tệp của bạn không phải là một cấu trúc JSON, đó là một loạt các đối tượng JSON riêng biệt. Từ mẫu của bạn, có vẻ như đó là một đối tượng trên mỗi dòng. Vì vậy, chúng ta hãy đọc cái này vào một danh sách:

with open['spam.json'] as f:
    things = [json.loads[line] for line in f]

Sau đó, chúng tôi sẽ xử lý cái này và viết nó ra:

with open['eggs.json', 'w'] as f:
    for thing in new_things:
        f.write[json.dumps[thing] + '\n']

Bây giờ, bạn không có cấu trúc JSON mà bạn muốn nối lại mọi thứ; Bạn có một danh sách các dicts, và bạn muốn tạo một danh sách các dicts mới, hợp nhất những người có cùng một khóa.

Đây là một cách để làm điều đó:

new_things = {}
for thing in things:
    thing_id = thing['id']
    try:
        old_thing = new_things[thing_id]
    except KeyError:
        new_things[thing_id] = thing
    else:
        old_thing['ua'].extend[thing['ua']]
new_things = new_things.values[]

Có một vài cách khác nhau mà bạn có thể đơn giản hóa điều này; Tôi chỉ viết nó theo cách này bởi vì nó không sử dụng các thủ thuật nào nên vượt ra ngoài một người mới. Ví dụ: bạn có thể làm bằng cách sắp xếp và nhóm:

def merge[things]:
    return {'id': things[0]['id'],
            'ua': list[itertools.chain.from_iterable[t['ua'] for t in things]]}
sorted_things = sorted[things, key=operator.itemgetter['id']]
grouped_things = itertools.groupby[sorted_things, key=operator.itemgetter['id']]
new_things = [merge[list[group]] for key, group in grouped_things]

Tôi đã không nhận ra từ câu hỏi ban đầu của bạn rằng bạn có hàng chục triệu hàng. Tất cả các bước trên yêu cầu tải toàn bộ dữ liệu gốc được đặt vào bộ nhớ, xử lý với một số lưu trữ tạm thời, sau đó viết lại. Nhưng nếu bộ dữ liệu của bạn quá lớn, bạn cần tìm cách xử lý một hàng cùng một lúc và giữ ít trong bộ nhớ đồng thời.

Đầu tiên, để xử lý một hàng cùng một lúc, bạn chỉ cần thay đổi danh sách ban đầu hiểu thành biểu thức của trình tạo và di chuyển phần còn lại của mã bên trong câu lệnh with, như thế này:

with open['spam.json'] as f:
    things = [json.loads[line] for line in f]
    for thing in things:
        # blah blah

Tại thời điểm đó, nó có thể dễ dàng viết lại như thế này:

with open['spam.json'] as f:
    for line in f:
        thing = json.loads[line]
        # blah blah

Tiếp theo, việc sắp xếp rõ ràng xây dựng toàn bộ danh sách được sắp xếp trong bộ nhớ, vì vậy điều đó không được chấp nhận ở đây. Nhưng nếu bạn không sắp xếp và nhóm, toàn bộ đối tượng kết quả new_things phải sống cùng một lúc [vì hàng đầu vào cuối cùng có thể phải được hợp nhất vào hàng đầu ra đầu tiên].

Dữ liệu mẫu của bạn dường như đã có các hàng được sắp xếp bởi

with open['eggs.json', 'w'] as f:
    for thing in new_things:
        f.write[json.dumps[thing] + '\n']
0. Nếu bạn có thể tin tưởng vào điều đó trong cuộc sống thực, hoặc chỉ tính vào các hàng luôn được nhóm bởi ____ 10, chỉ cần bỏ qua bước sắp xếp, điều này không làm gì ngoài việc lãng phí thời gian và bộ nhớ và sử dụng giải pháp nhóm.

Mặt khác, nếu bạn không thể tin tưởng vào các hàng được nhóm bởi

with open['eggs.json', 'w'] as f:
    for thing in new_things:
        f.write[json.dumps[thing] + '\n']
0, chỉ có hai cách thực sự để giảm bộ nhớ hơn nữa: nén dữ liệu theo một cách nào đó hoặc sao lưu lưu trữ vào đĩa.

Đối với giải pháp của người dùng Foo Bar đã xây dựng một cấu trúc dữ liệu đơn giản và nhỏ hơn [một bản đồ dict mà chúng ta có thể chuyển đổi sang định dạng cuối cùng một hàng cùng một lúc. Như thế này:

with open['spam.json'] as f:
    new_dict = defaultdict[list]
    for row in f:
        thing = json.loads[row]
        new_dict[thing["id"]].extend[thing["ua"]]
with open['eggs.json', 'w'] as f:
    for id, ua in new_dict.items[]: # use iteritems in Python 2.x
        thing = {'id': id, 'ua': ua}
        f.write[json.dumps[thing] + '\n']

Đối với lần thứ hai, Python đi kèm với một cách tốt đẹp để sử dụng cơ sở dữ liệu DBM như thể nó là một từ điển. Nếu giá trị của bạn chỉ là chuỗi, bạn có thể sử dụng mô -đun ____ 13/________ 14 [hoặc một trong các triển khai cụ thể]. Vì các giá trị của bạn là danh sách, bạn sẽ cần sử dụng

with open['eggs.json', 'w'] as f:
    for thing in new_things:
        f.write[json.dumps[thing] + '\n']
5 thay thế.

Dù sao, trong khi điều này sẽ làm giảm việc sử dụng bộ nhớ của bạn, nó có thể làm chậm mọi thứ. Trên một máy có 4GB RAM, việc tiết kiệm trong giao dịch hoán đổi pagefile có thể sẽ thổi bay thêm chi phí khi đi qua cơ sở dữ liệu nhưng trên một máy có RAM 16GB, bạn có thể chỉ cần thêm chi phí cho rất ít. Trước tiên, bạn có thể muốn thử nghiệm các tệp nhỏ hơn, để xem mã của bạn chậm hơn bao nhiêu với

with open['eggs.json', 'w'] as f:
    for thing in new_things:
        f.write[json.dumps[thing] + '\n']
5 so với
with open['eggs.json', 'w'] as f:
    for thing in new_things:
        f.write[json.dumps[thing] + '\n']
7 khi bộ nhớ không phải là vấn đề.

Ngoài ra, nếu mọi thứ vượt ra ngoài giới hạn bộ nhớ của bạn, bạn luôn có thể sử dụng cơ sở dữ liệu mạnh mẽ hơn thực sự có thể sắp xếp mọi thứ trên đĩa. Ví dụ [chưa được kiểm tra]:

db = sqlite3.connect['temp.sqlite']
c = db.cursor[]
c.execute['CREATE TABLE Things [tid, ua]']
for thing in things:
    for ua in thing['ua']:
        c.execute['INSERT INTO Things [tid, ua] VALUES [?, ?]',
                  thing['id'], ua]
c.commit[]
c.execute['SELECT tid, ua FROM Things ORDER BY tid']
rows = iter[c.fetchone, None]
grouped_things = itertools.groupby[rows, key=operator.itemgetter[0]]
new_things = [merge[list[group]] for key, group in grouped_things]
with open['eggs.json', 'w'] as f:
    for thing in new_things:
        f.write[json.dumps[thing] + '\n']

Làm cách nào để hợp nhất hai tệp JSON trong Python?

Tôi đang sử dụng mã dưới đây để hợp nhất các tệp:..
Dữ liệu = [].
cho f trong glob.glob ["*. json"]:.
Với Open [f,] như Infile:.
data.append[json.load[infile]].
Với Open ["SYNGED_FILE.JSON", 'W'] là Outfile:.
json.dump [dữ liệu, trang phục].
OUT: [[[a, b], [c, d], [e, f]], [[g, h], [i, f], [k, l]], [[m, n],[o, p], [q, r]]].

Chúng ta có thể hợp nhất hai tệp JSON không?

giản dị.JsonObject để hợp nhất hai đối tượng JSON trong Java.Chúng ta có thể hợp nhất hai đối tượng JSON bằng phương thức putall [] [được kế thừa từ Java giao diện.We can merge two JSON objects using the putAll[] method [inherited from interface java.

Làm cách nào để kết hợp nhiều tệp JSON?

Bước 1: Tải các tệp JSON với sự trợ giúp của Pandas DataFrame. Step 2 : Concatenate the dataframes into one dataframe. Step 3: Convert the concatenated dataframe into CSV file.

Bài Viết Liên Quan

Chủ Đề