Dữ liệu JSON in đẹp ra tệp bằng Python


111

Một dự án cho lớp liên quan đến việc phân tích dữ liệu Twitter JSON. Tôi đang lấy dữ liệu và thiết lập nó vào tệp mà không gặp nhiều khó khăn, nhưng tất cả đều nằm trong một dòng. Điều này tốt cho phần thao tác dữ liệu mà tôi đang cố gắng thực hiện, nhưng tệp này rất khó đọc và tôi không thể kiểm tra nó tốt, khiến việc viết mã cho phần thao tác dữ liệu rất khó khăn.

Có ai biết cách làm điều đó từ bên trong Python (tức là không sử dụng công cụ dòng lệnh, công cụ mà tôi không thể làm việc) không? Đây là mã của tôi cho đến nay:

header, output = client.request(twitterRequest, method="GET", body=None,
                            headers=None, force_auth_header=True)

# now write output to a file
twitterDataFile = open("twitterData.json", "wb")
# magic happens here to make it pretty-printed
twitterDataFile.write(output)
twitterDataFile.close()

Lưu ý Tôi đánh giá cao việc mọi người chỉ tôi đến tài liệu simplejson và những thứ đó, nhưng như tôi đã nói, tôi đã xem xét điều đó và tiếp tục cần hỗ trợ. Một câu trả lời thực sự hữu ích sẽ chi tiết và giải thích hơn những ví dụ được tìm thấy ở đó. Cảm ơn

Ngoài ra: Hãy thử điều này trong dòng lệnh windows:

more twitterData.json | python -mjson.tool > twitterData-pretty.json

kết quả là:

Invalid control character at: line 1 column 65535 (char 65535)

Tôi muốn cung cấp cho bạn dữ liệu tôi đang sử dụng, nhưng nó rất lớn và bạn đã thấy mã tôi sử dụng để tạo tệp.


1
Tôi nghi ngờ bạn thực sự muốn viết dữ liệu nhị phân ("wb")
Hamish

Tôi đã được dạy rằng điều này là cần thiết cho các máy Windows và cho đến nay tôi đã làm việc cho tất cả các bài tập của mình. Nếu bạn có thể cung cấp tài liệu về lý do tại sao điều này có thể không chính xác, tôi rất vui được xem xét nó.
Zelbinian

Nó chỉ cần thiết nếu bạn đang làm việc với các tệp nhị phân hoặc các trường hợp khác mà dạng kết thúc dòng cụ thể (ví dụ: \r\nvs \n) là quan trọng. Xem stackoverflow.com/questions/3257869/… . Trong trường hợp của bạn, bạn muốn kết thúc dòng thân thiện với cửa sổ, nhưng bạn có thể không nhận được điều đó từ điểm cuối twitter, vì vậy bạn nên mở ở chế độ văn bản.
Hamish

Điều này có trả lời câu hỏi của bạn không? Làm thế nào để in một tệp JSON?
wesinat0r

Câu trả lời:


102

Bạn nên sử dụng đối số tùy chọn indent.

header, output = client.request(twitterRequest, method="GET", body=None,
                            headers=None, force_auth_header=True)

# now write output to a file
twitterDataFile = open("twitterData.json", "w")
# magic happens here to make it pretty-printed
twitterDataFile.write(simplejson.dumps(simplejson.loads(output), indent=4, sort_keys=True))
twitterDataFile.close()

1
Cảm ơn bạn, nó hoạt động hoàn hảo . Bạn có thể giải thích tại sao "sort_keys" cần phải ở đó không?
Zelbinian

1
Nó không cần phải ở đó nhưng nó làm cho mọi thứ rất đẹp và được sắp xếp theo thứ tự bảng chữ cái. Tôi có xu hướng sử dụng nó khi tôi muốn con người có thể đọc được.
mattarieski

4
Được giải thích rõ, cảm ơn bạn -chúng tôi không cố gắng trở thành & $ & # nhưng mở / đóng để viết tệp không được khuyến khích, cấu trúc with thường được ưu tiên hơn: with open("name_of_file.json", "w") as f: f.write(my_formatted_json_var) Lợi thế là bạn chắc chắn tệp sẽ đóng, nói trên đoạn trích lớn hơn ...
logicOnAbstractions

withcú pháp chắc chắn đẹp hơn, nhưng tôi cố gắng mở rộng câu trả lời của mình cho khán giả của tôi
mattldrenki

73

Bạn có thể phân tích cú pháp JSON, sau đó xuất lại nó với các thụt lề như sau:

import json
mydata = json.loads(output)
print json.dumps(mydata, indent=4)

Xem http://docs.python.org/library/json.html để biết thêm thông tin.


@Zelbinian: vâng, nó cũng hoạt động với simplejson. Hãy xem tại đây simplejson.googlecode.com/svn/tags/simplejson-1.9.1/docs/…
RanRag

Điều này dẫn đến một tệp trống. header, output = client.request(twitterRequest, method="GET", body=None, headers=None, force_auth_header=True) twitterDataFile = open("twitterData.json", "wb") json.dumps(json.loads(output), twitterDataFile, indent=4) twitterDataFile.close()
Zelbinian

5
@Zelbinian - json.dumpstrả về một chuỗi. json.dumpghi vào một tệp.
dkamins

64
import json

with open("twitterdata.json", "w") as twitter_data_file:
    json.dump(output, twitter_data_file, indent=4, sort_keys=True)

Bạn không cần json.dumps()nếu không muốn phân tích cú pháp chuỗi sau đó, chỉ cần sử dụng json.dump(). Nó cũng nhanh hơn.


14

Bạn có thể sử dụng mô-đun json của python để in đẹp.

>>> import json
>>> print json.dumps({'4': 5, '6': 7}, sort_keys=True, indent=4)
{
    "4": 5,
    "6": 7
}

Vì vậy, trong trường hợp của bạn

>>> print json.dumps(json_output, indent=4)

Đã thử con đường đó và không may là nó không hoạt động tốt như bạn nghĩ.
Zelbinian

@Zelbinian: Exactky ý bạn là doesn't work as wellgì.?
RanRag

1
Nó xuất ra các dữ liệu trong một dòng duy nhất trong những gì nhìn được Python dict cú pháp thay vì cú pháp JSON khá in
Zelbinian

Bao gồm kết quả đầu ra trong câu hỏi của bạn dưới dạng chỉnh sửa. Vì vậy, chúng tôi có thể thấy nó.
RanRag

bằng cách sử dụng này, các mảng được liệt kê thành nhiều dòng của mỗi giá trị, sẽ rất tốt nếu bạn giữ mảng trên một dòng.
scape

4

Nếu bạn đã có các tệp JSON hiện có mà bạn muốn định dạng đẹp, bạn có thể sử dụng cái này:

    with open('twitterdata.json', 'r+') as f:
        data = json.load(f)
        f.seek(0)
        json.dump(data, f, indent=4)
        f.truncate()

3

Nếu bạn đang tạo * .json mới hoặc sửa đổi tệp josn hiện có, hãy sử dụng tham số "thụt lề" cho định dạng json chế độ xem đẹp.

import json
responseData = json.loads(output)
with open('twitterData.json','w') as twitterDataFile:    
    json.dump(responseData, twitterDataFile, indent=4)

1
import json
def writeToFile(logData, fileName, openOption="w"):
  file = open(fileName, openOption)
  file.write(json.dumps(json.loads(logData), indent=4)) 
  file.close()  

Mặc dù mã này có thể trả lời câu hỏi, cung cấp ngữ cảnh bổ sung về lý do và / hoặc cách mã này trả lời câu hỏi sẽ cải thiện giá trị lâu dài của nó.
Tân

-2

Bạn có thể chuyển hướng một tệp đến python và mở bằng công cụ và để đọc nó, hãy sử dụng nhiều hơn.

Mã mẫu sẽ là,

cat filename.json | python -m json.tool | more
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.