Pretty-Print JSON Data ไปยังไฟล์โดยใช้ Python


113

โครงการสำหรับชั้นเรียนเกี่ยวข้องกับการแยกวิเคราะห์ข้อมูล Twitter JSON ฉันได้รับข้อมูลและตั้งค่าเป็นไฟล์โดยไม่มีปัญหามาก แต่ทั้งหมดอยู่ในบรรทัดเดียว นี่เป็นเรื่องปกติสำหรับการจัดการข้อมูลที่ฉันพยายามทำ แต่ไฟล์นั้นอ่านยากอย่างน่าขันและฉันไม่สามารถตรวจสอบได้ดีนักทำให้การเขียนโค้ดสำหรับส่วนการจัดการข้อมูลทำได้ยากมาก

ไม่มีใครรู้วิธีการทำจากภายใน Python (เช่นไม่ใช้เครื่องมือบรรทัดคำสั่งซึ่งฉันไม่สามารถทำงานได้) นี่คือรหัสของฉันจนถึงตอนนี้:

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()

หมายเหตุฉันขอขอบคุณผู้คนที่ชี้ให้ฉันดูเอกสารของ simplejson และเช่นนั้น แต่อย่างที่ฉันได้กล่าวไปฉันได้ดูแล้วและต้องการความช่วยเหลือ คำตอบที่เป็นประโยชน์อย่างแท้จริงจะมีรายละเอียดและอธิบายได้มากกว่าตัวอย่างที่พบในนั้น ขอบคุณ

นอกจากนี้: ลองสิ่งนี้ในบรรทัดคำสั่งของ windows:

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

ผลลัพธ์ในสิ่งนี้:

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

ฉันจะให้ข้อมูลที่ฉันใช้ แต่มีขนาดใหญ่มากและคุณเห็นรหัสที่ฉันใช้สร้างไฟล์แล้ว


1
ฉันสงสัยว่าคุณต้องการเขียนข้อมูลไบนารี ("wb")
ฮามิช

ฉันได้รับการสอนว่าสิ่งนี้จำเป็นสำหรับเครื่อง Windows และจนถึงตอนนี้ก็ได้ทำงานที่ได้รับมอบหมายทั้งหมด หากคุณสามารถเสนอเอกสารเกี่ยวกับสาเหตุที่อาจไม่ถูกต้องเรายินดีที่จะตรวจสอบ
Zelbinian

จำเป็นก็ต่อเมื่อคุณกำลังทำงานกับไฟล์ไบนารีหรือกรณีอื่น ๆ ที่รูปแบบเฉพาะของการสิ้นสุดบรรทัด (เช่น\r\nvs \n) มีความสำคัญ ดูstackoverflow.com/questions/3257869/… . ในกรณีของคุณคุณต้องการลงท้ายบรรทัดที่เป็นมิตรกับ windows แต่คุณอาจไม่ได้รับจากจุดสิ้นสุดของ twitter ดังนั้นคุณควรเปิดในโหมดข้อความ
Hamish

สิ่งนี้ตอบคำถามของคุณหรือไม่? จะพิมพ์ไฟล์ JSON ได้อย่างไร
wesinat0r

คำตอบ:


103

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
ขอขอบคุณที่ทำงานได้อย่างสมบูรณ์แบบ คุณอธิบายได้ไหมว่าทำไมต้องมี "sort_keys" อยู่ในนั้น
Zelbinian

1
ไม่จำเป็นต้องมี แต่มันทำให้สิ่งต่าง ๆ สวยงามมากและเรียงตามตัวอักษร ฉันมักจะใช้เมื่อต้องการผลลัพธ์ที่มนุษย์อ่านได้
mattbornski

4
อธิบายได้ดีขอบคุณ - แม้ว่าจะไม่พยายามเป็น & $ & # แต่การเปิด / ปิดเพื่อเขียนไฟล์ไม่ได้รับการสนับสนุนโดยทั่วไปแล้วโครงสร้างที่มีจะดีกว่า: with open("name_of_file.json", "w") as f: f.write(my_formatted_json_var) ข้อดีคือคุณแน่ใจว่าไฟล์จะปิดพูดในตัวอย่างที่ใหญ่กว่า ...
logicOnAbstractions

withไวยากรณ์ดีกว่าแน่นอน แต่ฉันพยายามปรับขนาดคำตอบของฉันกับผู้ชมของฉัน
mattbornski

74

คุณสามารถแยกวิเคราะห์ JSON จากนั้นส่งออกอีกครั้งด้วยการเยื้องดังนี้:

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

ดูhttp://docs.python.org/library/json.htmlสำหรับข้อมูลเพิ่มเติม


@ Zelbinian: ใช่มันใช้ได้กับ simplejson ด้วยลองดูที่นี่simplejson.googlecode.com/svn/tags/simplejson-1.9.1/docs/…
RanRag

ส่งผลให้ไฟล์ว่างเปล่า 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.dumpsส่งคืนสตริง json.dumpเขียนลงไฟล์
dkamins

66
import json

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

คุณไม่จำเป็นต้องถ้าคุณไม่ต้องการที่จะแยกสตริงต่อมาเพียงแค่การใช้งานjson.dumps() json.dump()เร็วกว่าด้วย


14

คุณสามารถใช้โมดูลjsonของ python เพื่อพิมพ์สวย ๆ

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

ดังนั้นในกรณีของคุณ

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

ลองเส้นทางนั้นแล้ว แต่น่าเสียดายที่ไม่ได้ผลอย่างที่คิด
Zelbinian

@ Zelbinian: แน่นอนคุณหมายถึงdoesn't work as wellอะไร?
RanRag

1
มันส่งข้อมูลออกมาในบรรทัดเดียวในสิ่งที่ดูเหมือนจะเป็นไวยากรณ์ Python dict แทนที่จะเป็นไวยากรณ์ Json ที่พิมพ์ออกมาสวย
Zelbinian

รวมผลลัพธ์ในคำถามของคุณเป็นการแก้ไขดังนั้นเราสามารถดูได้
RanRag

การใช้สิ่งนี้อาร์เรย์จะแสดงรายการเป็นหลายบรรทัดของแต่ละค่ามันเป็นการดีที่จะเก็บอาร์เรย์ไว้ในบรรทัดเดียว
scape

4

หากคุณมีไฟล์ JSON อยู่แล้วซึ่งต้องการจัดรูปแบบให้สวยงามคุณสามารถใช้สิ่งนี้:

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

3

หากคุณกำลังสร้าง * .json ใหม่หรือแก้ไขไฟล์ josn ที่มีอยู่ให้ใช้พารามิเตอร์ "indent" สำหรับรูปแบบ json ที่ดูสวย

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()  

แม้ว่ารหัสนี้อาจตอบคำถาม แต่การให้บริบทเพิ่มเติมเกี่ยวกับสาเหตุและ / หรือวิธีที่รหัสนี้ตอบคำถามช่วยเพิ่มคุณค่าในระยะยาว
Tân

-2

คุณสามารถเปลี่ยนเส้นทางไฟล์ไปยัง python และเปิดโดยใช้เครื่องมือและอ่านเพิ่มเติมได้

โค้ดตัวอย่างจะเป็น

cat filename.json | python -m json.tool | more
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.