Lấy dữ liệu từ file JSON

Nội dung chính

Giới thiệu

Trong bài viết này, chúng ta sẽ phân tích cú pháp, đọc và ghi dữ liệu JSON vào một tệp bằng Python.

Trong 5-10 năm qua, định dạng JSON là một trong những cách phổ biến nhất để tuần tự hóa dữ liệu. Đặc biệt là trong thế giới phát triển web, bạn có thể gặp JSON thông qua một trong nhiều API REST , cấu hình ứng dụng hoặc thậm chí lưu trữ dữ liệu đơn giản.

Với mức độ phổ biến và tác động của nó đối với lập trình, tại một số thời điểm trong quá trình phát triển của mình, bạn có thể muốn học cách đọc JSON từ một tệp hoặc ghi JSON vào một tệp. Cả hai tác vụ này đều khá dễ thực hiện với Python, như bạn sẽ thấy trong một vài phần tiếp theo.

Ghi JSON vào một tệp

Cách dễ nhất để ghi dữ liệu của bạn ở định dạng JSON vào một tệp bằng Python là sử dụng lưu trữ dữ liệu của bạn trong một object của dict, object này có thể chứa các dict, mảng, boolean lồng nhau hoặc các kiểu nguyên thủy khác như số nguyên và chuỗi. Bạn có thể tìm thấy danh sách chi tiết hơn về các loại dữ liệu được hỗ trợ  .

Việc xây dựng trong gói json có magic code mà Python biến đối tượng dict của bạn vào chuỗi JSON serialized.

import json

data = {}
data['people'] = []
data['people'].append({
    'name': 'Scott',
    'website': 'stackabuse.com',
    'from': 'Nebraska'
})
data['people'].append({
    'name': 'Larry',
    'website': 'google.com',
    'from': 'Michigan'
})
data['people'].append({
    'name': 'Tim',
    'website': 'apple.com',
    'from': 'Alabama'
})

with open('data.txt', 'w') as outfile:
    json.dump(data, outfile)

Sau khi import thư việc json, chúng ta xây dựng một số dữ liệu đơn giản để ghi vào tệp của chúng ta. Phần quan trọng nằm ở phần cuối khi chúng ta sử dụng câu lênh with để mở tệp đích, sau đó sử dụng  để ghi đối tượng data vào tệp outfile.

Bất kỳ đối tượng giống tệp nào cũng có thể được truyền cho đối số thứ hai, ngay cả khi nó không phải là tệp thực. Một ví dụ điển hình về điều này sẽ là một socket, có thể mở, đóng và ghi vào một tệp giống như vậy. Với việc JSON phổ biến trên toàn bộ web, đây là một trường hợp sử dụng khác mà bạn có thể gặp phải.

Một biến thể nhỏ trên phương thức json.dumps đáng nói là  , trả về chuỗi JSON thực thay vì gửi trực tiếp đến một đối tượng có thể ghi. Điều này có thể cung cấp cho bạn thêm một số quyền kiểm soát nếu bạn cần thực hiện một số thay đổi đối với chuỗi JSON (chẳng hạn như mã hóa chuỗi).

Đọc JSON từ một tệp

Mặt khác, đọc dữ liệu JSON từ một tệp cũng dễ dàng như ghi nó vào một tệp. Sử dụng lại cùng gói json, chúng ta có thể trích xuất và phân tích cú pháp chuỗi JSON trực tiếp từ một đối tượng tệp. Trong ví dụ sau, chúng ta đọc file và sau đó in ra dữ liệu chúng ta nhận được:

import json

with open('data.txt') as json_file:
    data = json.load(json_file)
    for p in data['people']:
        print('Name: ' + p['name'])
        print('Website: ' + p['website'])
        print('From: ' + p['from'])
        print('')

 là phương thức quan trọng cần lưu ý ở đây. Nó đọc chuỗi từ tệp, phân tích cú pháp dữ liệu JSON, điền dữ liệu vào Python dict và trả lại cho bạn.

Cũng giống như json.dump, json.load có một phương thức thay thế cho phép bạn xử lý các chuỗi trực tiếp vì nhiều khi bạn có thể sẽ không có đối tượng giống tệp chứa JSON của bạn. Như bạn có thể đoán, phương thức này là  . Hãy xem xét trường hợp bạn đang gọi một điểm cuối REST GET trả về JSON. Dữ liệu này đến với bạn dưới dạng một chuỗi, sau đó bạn có thể chuyển json.loads trực tiếp vào đó.

Tùy chọn

Khi tuần tự hóa dữ liệu của bạn sang JSON bằng Python, kết quả sẽ ở định dạng chuẩn và không dễ đọc vì khoảng trắng bị loại bỏ. Mặc dù đây là hành vi lý tưởng cho hầu hết các trường hợp, nhưng đôi khi bạn có thể cần thực hiện những thay đổi nhỏ, chẳng hạn như thêm khoảng trắng để con người có thể đọc được. Cả hai json.dump và json.load cung cấp khá nhiều tùy chọn để linh hoạt hơn, một vài trong số đó sẽ được mô tả ở đây.

Pretty-Printing

Làm cho JSON con người có thể đọc được (hay còn gọi là “Pretty-Printing”) dễ dàng như việc thêm một giá trị số nguyên cho tham số indent :

>>> import json
>>> data = {'people':[{'name': 'Scott', 'website': 'stackabuse.com', 'from': 'Nebraska'}]}
>>> json.dumps(data, indent=4)
{
    "people": [
        {
            "website": "stackabuse.com", 
            "from": "Nebraska", 
            "name": "Scott"
        }
    ]
}

Điều này thực sự khá hữu ích vì bạn thường phải đọc dữ liệu JSON trong quá trình phát triển. Một tùy chọn khác là sử dụng công cụ dòng lệnh json.tool. Vì thế, nếu bạn chỉ muốn in JSON đẹp mắt vào dòng lệnh, bạn có thể làm như sau:

echo '{"people":[{"name":"Scott", "website":"stackabuse.com", "from":"Nebraska"}]}' | python -m json.tool

{
    "people": [
        {
            "name": "Scott",
            "website": "stackabuse.com"
            "from": "Nebraska",
        }
    ]
}
Sắp xếp

Trong JSON, một đối tượng được định nghĩa là:

Một đối tượng là một tập hợp các cặp tên / giá trị không có thứ tự.

Vì vậy, tiêu chuẩn nói rằng thứ tự key không được đảm bảo, nhưng có thể bạn cần nó cho mục đích của mình. Để sắp xếp theo thứ tự, bạn có thể chuyển True sang sort_keys tùy chọn khi sử dụng json.dump hoặc json.dumps.

>>> import json
>>> data = {'people':[{'name': 'Scott', 'website': 'stackabuse.com', 'from': 'Nebraska'}]}
>>> json.dumps(data, sort_keys=True, indent=4)
{
    "people": [
        {
            "from": "Nebraska",
            "name": "Scott",
            "website": "stackabuse.com"
        }
    ]
}
ASCII Text

Theo mặc định, json.dump sẽ đảm bảo rằng tất cả văn bản của bạn trong từ điển Python nhất định đều được mã hóa ASCII. Nếu các ký tự không phải ASCII hiện diện, thì chúng sẽ tự động được thoát ra, như thể hiện trong ví dụ sau:

>>> import json
>>> data = {'item': 'Beer', 'cost':'£4.00'}
>>> jstr = json.dumps(data, indent=4)
>>> print(jstr)
{
    "item": "Beer",
    "cost": "\u00a34.00"
}

Điều này không phải lúc nào cũng được chấp nhận và trong nhiều trường hợp, bạn có thể muốn giữ các ký tự Unicode của mình không bị chạm vào. Để làm điều này, hãy đặt ensure_ascii tùy chọn thành False.

>>> jstr = json.dumps(data, ensure_ascii=False, indent=4)
>>> print(jstr)
{
    "item": "Beer",
    "cost": "£4.00"
}

Phần kết luận

Trong bài viết này, tôi giới thiệu cho bạn json.dump, json.dumps, json.load, và json.loads phương pháp mà giúp đỡ trong serializing và deserializing chuỗi JSON.

Với việc JSON đã trở thành một trong những cách phổ biến nhất để tuần tự hóa dữ liệu có cấu trúc, bạn có thể sẽ phải tương tác với nó khá thường xuyên, đặc biệt là khi làm việc trên các ứng dụng web. Module json của Python là một cách tuyệt vời để bắt đầu, hoặc bạn có thể bạn tham khảo thêm simplejson là một giải pháp thay thế tuyệt vời khác ít nghiêm ngặt hơn nhiều về cú pháp JSON.