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


320

Tôi đang hơi đau đầu chỉ vì một câu nói đơn giản, dễ nhìn đang ném một số lỗi vào mặt tôi.

Tôi có một tệp json được gọi là String.json như thế này:

"strings": [{"-name": "city", "#text": "City"}, {"-name": "phone", "#text": "Phone"}, ...,
            {"-name": "address", "#text": "Address"}]

Tôi muốn đọc các tập tin json, chỉ bây giờ. Tôi có những tuyên bố mà tôi phát hiện ra, nhưng nó không hoạt động:

import json
from pprint import pprint

with open('strings.json') as json_data:
    d = json.loads(json_data)
    json_data.close()
    pprint(d)

Lỗi hiển thị trên bàn điều khiển là:

Traceback (most recent call last):
  File "/home/.../android/values/manipulate_json.py", line 5, in <module>
    d = json.loads(json_data)
  File "/usr/lib/python2.7/json/__init__.py", line 326, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: expected string or buffer
[Finished in 0.1s with exit code 1]

Đã chỉnh sửa

Thay đổi từ json.loadsđếnjson.load

và đã nhận được điều này:

Traceback (most recent call last):
  File "/home/.../android/values/manipulate_json.py", line 5, in <module>
    d = json.load(json_data)
  File "/usr/lib/python2.7/json/__init__.py", line 278, in load
    **kw)
  File "/usr/lib/python2.7/json/__init__.py", line 326, in loads
    return _default_decoder.decode(s)
  File "/usr/lib/python2.7/json/decoder.py", line 369, in decode
    raise ValueError(errmsg("Extra data", s, end, len(s)))
ValueError: Extra data: line 829 column 1 - line 829 column 2 (char 18476 - 18477)
[Finished in 0.1s with exit code 1]

6
Bạn có chắc chắn rằng tệp chứa JSON hợp lệ?
Thuốc nổ



Tập tin của bạn là một định dạng json không hợp lệ. Thay đổi nó thành: {"strings": [{"-name": "city", "#text": "City"}, {"-name": "phone", "#text": "Phone"}, ..., {"-name": "address", "#text": "Address"}]}
krizex

Câu trả lời:


546

Các json.load()phương pháp (không có "s" trong "tải") có thể đọc một tập tin trực tiếp:

import json

with open('strings.json') as f:
    d = json.load(f)
    print(d)

Bạn đang sử dụng json.loads()phương thức được sử dụng cho chuỗi đối số .

Chỉnh sửa: Tin nhắn mới là một vấn đề hoàn toàn khác. Trong trường hợp đó, có một số json không hợp lệ trong tập tin đó. Vì vậy, tôi khuyên bạn nên chạy tệp thông qua trình xác nhận json .

Ngoài ra còn có các giải pháp để sửa lỗi json như ví dụ: Làm thế nào để tôi tự động sửa một chuỗi JSON không hợp lệ? .


2
hm ... tôi đã thay đổi từ json.loads thành json.load nhưng tôi nhận được thông điệp tốt đẹp đó.
RRC

5
Ah, thông điệp mới là một vấn đề hoàn toàn khác. Trong trường hợp đó, có một số json không hợp lệ trong tập tin đó. Vì vậy, tôi khuyên bạn nên chạy tệp thông qua trình xác nhận json .
ubomb

3
hiểu rồi! Các tập tin bị thiếu EOF. Các tập tin đã không kết thúc chính xác. Tôi sẽ không nhận ra rằng nếu đó không phải là đề xuất tốt của bạn! Cảm ơn!
RRC

1
ubomb, nếu bạn có thể thay đổi, bạn trả lời tôi để đánh dấu nó là chấp nhận. Thoải mái! Tôi sẽ đánh dấu nó.
RRC

Tôi phải mở tệp bằng cờ byte, sau đó tôi có thể sử dụng phương thức json.load, tại sao? Tôi đã nhận Py3.6
Grzegorz Krug

113

Đây là một bản sao mã hoạt động tốt cho tôi

import json

with open("test.json") as json_file:
    json_data = json.load(json_file)
    print(json_data)

với dữ liệu

{
    "a": [1,3,"asdf",true],
    "b": {
        "Hello": "world"
    }
}

bạn có thể muốn bọc dòng json.load của mình bằng một lần thử vì JSON không hợp lệ sẽ gây ra thông báo lỗi stacktrace.


41

Vấn đề đang sử dụng với câu lệnh:

with open('strings.json') as json_data:
    d = json.load(json_data)
    pprint(d)

Các tập tin sẽ được đóng hoàn toàn. Không cần phải gọi json_data.close()lại.


1
Vui lòng xóa json_data.c Đóng (). Như đã đề cập, nó sẽ được gọi ngầm.
Bonnie Varghese

1
@Zongjun: Vui lòng sửa tải cho json.load (json_data).
Hiệp sĩ71

2
để in đẹp, tôi phải sử dụng:print(json.dumps(d,sort_keys=True,indent=2))
Mike D

25

Trong python 3, chúng ta có thể sử dụng phương pháp dưới đây.

Đọc từ tệp và chuyển đổi sang JSON

import json
from pprint import pprint

# Considering "json_list.json" is a json file

with open('json_list.json') as fd:
     json_data = json.load(fd)
     pprint(json_data)

với câu lệnh tự động đóng bộ mô tả tập tin đã mở.


Chuỗi thành JSON

import json
from pprint import pprint

json_data = json.loads('{"name" : "myName", "age":24}')
pprint(json_data)


1

Bạn có thể sử dụng thư viện gấu trúc để đọc tệp JSON.

import pandas as pd
df = pd.read_json('strings.json',lines=True)
print(df)

0

Điều này làm việc cho tôi.

json.load () chấp nhận đối tượng tệp, phân tích dữ liệu JSON, điền từ điển Python với dữ liệu và trả lại cho bạn.

Giả sử tệp JSON là như thế này:

{
   "emp_details":[
                 {
                "emp_name":"John",
                "emp_emailId":"john@gmail.com"  
                  },
                {
                 "emp_name":"Aditya",
                 "emp_emailId":"adityatest@yahoo.com"
                }
              ] 
}

import json 

# Opening JSON file 
f = open('data.json',) 

# returns JSON object as  
# a dictionary 
data = json.load(f) 

# Iterating through the json 
# list 
for i in data['emp_details']: 
    print(i) 

# Closing file 
f.close()

#Output:
{'emp_name':'John','emp_emailId':'john@gmail.com'}
{'emp_name':'Aditya','emp_emailId':'adityatest@yahoo.com'}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.