2012-02-07 9 views
26

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

Có ai biết cách thực hiện điều đó từ bên trong Python (tức là không sử dụng công cụ dòng lệnh mà tôi không thể làm việc) không? Dưới đâ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() 

Note Tôi đánh giá cao những người đã chỉ cho tôi để simplejson tài liệu và như vậy, nhưng như tôi đã nói, tôi đã nhìn thấy và tiếp tục cần sự giúp đỡ. Câu trả lời thực sự hữu ích sẽ chi tiết hơn và giải thích hơn các ví dụ được tìm thấy ở đó. Cảm ơn

Ngoài ra: Cố gắng này trong cửa sổ dòng lệnh:

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

kết quả trong việc này:

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

tôi muốn cung cấp cho bạn các 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 ghi dữ liệu nhị phân ("wb") – Hamish

+0

Tôi đã được dạy điều này là cần thiết cho máy Windows và do đó đến nay đã làm việc cho tất cả các bài tập của tôi. 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 khi xem xét nó. – Zelbinian

+0

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à hình thức cụ thể của dòng kết thúc (ví dụ: '\ r \ n' so với' \ n') là quan trọng. Xem http://stackoverflow.com/questions/3257869/difference-between-binary-and-text-i-o-in-python-on-windows.Trong trường hợp của bạn, bạn muốn cửa sổ dòng kết thúc thân thiện, nhưng bạn có thể không nhận được rằng từ điểm cuối twitter, vì vậy bạn nên mở trong chế độ văn bản. – Hamish

Trả lời

27
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() 
+0

Cảm ơn bạn, đã làm việc ** hoàn hảo **. Bạn có thể giải thích tại sao "sort_keys" cần phải ở trong đó không? – Zelbinian

+0

Nó không cần phải có nhưng nó làm cho mọi thứ rất đẹp và 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 đầu ra có thể đọc được của con người. – mattbornski

+2

Cũng giải thích cảm ơn bạn - bất cứ khi nào 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 chung thường thích hợp hơn: 'với mở (" name_of_file.json "," w ") f: f.write (my_formatted_json_var) ' Lợi thế là bạn chắc chắn tệp sẽ đóng, giả sử trên các đoạn mã lớn hơn ... –

24

Bạn có thể phân tích cú pháp JSON, sau đó đầu ra nó một lần nữa với indents như thế này:

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

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

+0

Tôi đoán công việc này cho simplejson chỉ là tốt? – Zelbinian

+0

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

+0

Kết quả là một tệp trống. 'header, output = client.request (twitterRequest, method =" GET ", body = None, tiêu đề = Không, force_auth_header = True) twitterDataFile = open (" twitterData.json "," wb ") json. dumps (json.loads (đầu ra), twitterDataFile, indent = 4) twitterDataFile.close() ' – Zelbinian

8

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) 
+0

Đã thử tuyến đường đó và tiếc là không hoạt động tốt như bạn nghĩ. – Zelbinian

+0

@Zelbinian: Exactky ý của bạn là gì bởi 'cũng không hoạt động tốt'.? – RanRag

+1

Nó xuất các dữ liệu trong một dòng trong những gì trông được Python dict cú pháp thay vì cú pháp Json khá in – Zelbinian

-1

Tôi biết đây là một câu hỏi cũ, tình cờ gặp câu hỏi này và tìm thấy một câu trả lời đơn giản. Chỉ cần chuyển hướng filename.json sang python và mở bằng công cụ và đọc nó sử dụng nhiều hơn.

Mẫu mã sẽ được,

mèo filename.json | python -m json.tool | thêm

1
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 phân tích cú pháp sau này, chỉ cần sử dụng json.dump(). Nó cũng nhanh hơn.