Câu hỏi Phân tích các giá trị từ một tệp JSON?


Tôi có JSON này trong một tệp:

{
    "maps": [
        {
            "id": "blabla",
            "iscategorical": "0"
        },
        {
            "id": "blabla",
            "iscategorical": "0"
        }
    ],
    "masks": [
        "id": "valore"
    ],
    "om_points": "value",
    "parameters": [
        "id": "valore"
    ]
}

Tôi đã viết kịch bản này in tất cả các văn bản json:

json_data=open(file_directory).read()

data = json.loads(json_data)
pprint(data)

Làm cách nào để phân tích tệp và trích xuất các giá trị đơn lẻ?


1109
2018-05-14 15:54


gốc


Xem thêm: Đọc và viết ví dụ cho JSON - Martin Thoma
Tôi tạo kho lưu trữ nhỏ trên github cho thấy cách thực hiện: github.com/burlachenkok/json_processing. Tôi đã tạo câu trả lời vào ngày hôm qua, nhưng nó đã bị đánh dấu là đã xóa vì nó liên kết đến một địa điểm khác - bruziuz


Các câu trả lời:


Tôi nghĩ những gì Ignacio nói là tệp JSON của bạn không chính xác. Bạn có [] khi bạn nên có {}. [] dành cho danh sách, {} dành cho từ điển.

Dưới đây là cách tệp JSON của bạn nên xem xét, tệp JSON của bạn thậm chí sẽ không tải cho tôi:

{
    "maps": [
        {
            "id": "blabla",
            "iscategorical": "0"
        },
        {
            "id": "blabla",
            "iscategorical": "0"
        }
    ],
    "masks": {
        "id": "valore"
    },
    "om_points": "value",
    "parameters": {
        "id": "valore"
    }
}

Sau đó, bạn có thể sử dụng mã của mình:

import json
from pprint import pprint

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

pprint(data)

Với dữ liệu, bây giờ bạn có thể tìm thấy các giá trị như vậy:

data["maps"][0]["id"]
data["masks"]["id"]
data["om_points"]

Hãy thử những người ra và xem nếu nó bắt đầu có ý nghĩa.


1667
2018-05-14 16:10



Ok vì vậy tôi phải kiểm soát mã của tôi vì tệp json này được tạo từ một đối tượng java. Cảm ơn. - michele
Trên thực tế, tôi nghĩ bạn nên sử dụng 'with' trong câu trả lời của bạn. Tôi vẫn đưa ra một +1 mặc dù bởi vì tôi nghĩ rằng nó có giá trị cho một người mới. - lpapp
Cảm ơn các giải pháp. Tôi đang nhận được một biểu tượng unicode trong khi in nó. (ví dụ u'valore '). Làm thế nào để ngăn chặn nó? - diaryfolio
Nice nhưng python thêm một u' trước mỗi phím. Bất kỳ ý tưởng tại sao? - CodyBugstein
Đó là lý do tại sao văn bản của bạn là gõ unicode không phải chuỗi. Hầu hết thời gian là tốt hơn để có văn bản trong unicode cho umlauts Đức và để chia sẻ kết quả văn bản với các mô-đun / chương trình vv. Vì vậy, bạn tốt! - Michael P


Của bạn data.json sẽ trông như thế này:

{
 "maps":[
         {"id":"blabla","iscategorical":"0"},
         {"id":"blabla","iscategorical":"0"}
        ],
"masks":
         {"id":"valore"},
"om_points":"value",
"parameters":
         {"id":"valore"}
}

Mã của bạn phải là:

import json
from pprint import pprint

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

Lưu ý rằng điều này chỉ hoạt động trong Python 2.6 trở lên, vì nó phụ thuộc vào with-tuyên bố. Trong Python 2.5 sử dụng from __future__ import with_statement, bằng Python <= 2,4, xem Câu trả lời của Justin Peel, câu trả lời này dựa trên.

Bây giờ bạn có thể truy cập các giá trị đơn như sau:

data["maps"][0]["id"]  # will return 'blabla'
data["masks"]["id"]    # will return 'valore'
data["om_points"]      # will return 'value'

270
2017-11-29 20:10



Tôi có một downvote về điều này. Có lẽ nó không rõ ràng, tại sao tôi nghĩ rằng một câu trả lời là cần thiết. Đã thêm ghi chú về tính tương thích của câu lệnh. - Bengt
Xin lỗi vì cuộn lại, nhưng mã được đề xuất sẽ tiếp tục data_file  opened lâu hơn cần thiết. - Bengt
Tham khảo tài liệu 2.6 (docs.python.org/2.6/library/io.html), mở một tệp trong ngữ cảnh "với" sẽ tự động đóng tệp. - Steve S.
@SteveS. Có, nhưng không phải trước khi bối cảnh còn lại. pprinting trong with-context giữ data_file mở lâu hơn. - Bengt
@GayanPathirage bạn truy cập vào nó như data["om_points"] , data["masks"]["id"]. Ý tưởng là bạn có thể đạt đến bất kỳ cấp độ nào trong từ điển bằng cách chỉ định 'các đường dẫn chính'. Nếu bạn nhận được KeyError ngoại lệ nó có nghĩa là chìa khóa không tồn tại trong đường dẫn. Tìm hiểu lỗi chính tả hoặc kiểm tra cấu trúc của từ điển của bạn. - Nuhman


Câu trả lời của @Justin Peel thực sự hữu ích, nhưng nếu bạn đang sử dụng Python 3 đọc JSON nên được thực hiện như sau:

with open('data.json', encoding='utf-8') as data_file:
    data = json.loads(data_file.read())

Lưu ý: sử dụng json.loads thay vì json.load. Trong Python 3, json.loads lấy một tham số chuỗi. json.load có tham số đối tượng giống như tệp. data_file.read() trả về một đối tượng chuỗi.


61
2018-05-22 03:44



Tại sao nên json.load tránh được .loads trong Python 3? - Zearin
Trang bạn đã liên kết không nói bất cứ điều gì về việc tránh load. - Dan Hulme
Câu trả lời này đọc toàn bộ tập tin vào bộ nhớ khi không có và gợi ý rằng trong các tệp JSON của Python 3 không thể đọc được một cách lười biếng, điều này là không đúng sự thật. Tôi xin lỗi, nhưng nó rõ ràng là downvote. - Łukasz Rogalski
Câu trả lời này không chính xác. Không có lý do gì để không sử dụng json.load với một trình xử lý tệp mở trong python3. Xin lỗi cho downvote, nhưng nó không có vẻ như bạn đọc các ý kiến ​​ở trên rất cẩn thận. - dusktreader
+1 Câu trả lời này thật tuyệt vời! Cảm ơn bạn vì điều đó và kéo tôi đi xa để tìm kiếm một hàm có thể sử dụng các chuỗi khiến tôi chỉ làm việc với các chuỗi và yêu cầu mạng không phải là tệp! - newpeople


data = []
with codecs.open('d:\output.txt','rU','utf-8') as f:
    for line in f:
       data.append(json.loads(line))

47
2018-05-12 20:47



đây là giải pháp đúng nếu bạn có nhiều đối tượng json trong một tệp. json.loads không giải mã nhiều đối tượng json. Nếu không, bạn sẽ gặp phải lỗi 'Dữ liệu bổ sung'. - yasin_alm
Đây là câu trả lời hay nhất. Nếu không, nó sẽ gây ra lỗi 'Dữ liệu bổ sung'. - Earthx9
Có đối tượng json mutliple trong một tập tin có nghĩa rằng tập tin chính nó không phải là thực sự hợp lệ json. Nếu bạn có nhiều đối tượng để bao gồm trong tệp json, chúng phải được chứa trong một mảng ở cấp cao nhất của tệp. - dusktreader


"Ultra JSON" hoặc đơn giản là "ujson" có thể xử lý việc [] trong tệp nhập JSON của bạn. Nếu bạn đang đọc tệp đầu vào JSON vào chương trình của mình dưới dạng danh sách các phần tử JSON; nhu la, [{[{}]}, {}, [], etc...] ujson có thể xử lý bất kỳ thứ tự tùy ý nào trong danh sách từ điển, từ điển của danh sách.

Bạn có thể tìm thấy ujson trong Chỉ mục gói Python và API gần giống với tích hợp của Python json thư viện.

ujson cũng nhanh hơn nhiều nếu bạn đang tải các tệp JSON lớn hơn. Bạn có thể xem chi tiết hiệu suất so với các thư viện JSON JSON khác trong cùng một liên kết được cung cấp.


11
2018-03-09 21:38





nếu bạn đang ở python 3 ở đây là cách bạn có thể làm điều đó

{
  "connection1": {
    "DSN": "con1",
    "UID": "abc",
    "PWD": "1234",
    "connection_string_python":"test1"
  }
  ,
  "connection2": {
    "DSN": "con2",
    "UID": "def",
    "PWD": "1234"
  }
}

Mã phải giống như giả định tệp connection.json trông giống như trên

connection_file = open('connection.json', 'r')
conn_string = json.load(connection_file)
conn_string['connection1']['connection_string_python'])
connection_file.close()
>>>test1

6
2018-04-25 17:42



điều này cũng hoạt động trong 2.7.5 - siddardha
điều này để mở tập tin xử lý. sử dụng một with tuyên bố sẽ tốt hơn - Corey Goldberg


   # Here you go with modified json file:
   # data.json file : 
    {
        "maps": [
            {
                "id": "blabla",
                "iscategorical": "0"
            },
            {
                "id": "blabla",
                "iscategorical": "0"
            }
        ],
        "masks": [{
            "id": "valore"
        }],
        "om_points": "value",
        "parameters": [{
            "id": "valore"
        }]
    }


   # You can call or print data on console by using below lines

    import json
    from pprint import pprint
    with open('data.json') as data_file:
        data_item = json.load(data_file)
    pprint(data_item)

    print(data_item['parameters'][0]['id'])

    #Output : 
    #pprint(data_item) output as :

    {'maps': [{'id': 'blabla', 'iscategorical': '0'},
              {'id': 'blabla', 'iscategorical': '0'}],
     'masks': [{'id': 'valore'}],
     'om_points': 'value',
     'parameters': [{'id': 'valore'}]}
    #print(data_item['parameters'][0]['id']) output as :
    valore

4
2017-11-07 01:53



Nếu chúng ta muốn thêm một cột để đếm có bao nhiêu quan sát "bản đồ" có, làm thế nào chúng ta có thể viết hàm này? - Chenxi