Python을 사용하여 파일에 예쁜 인쇄 JSON 데이터


111

클래스 용 프로젝트에는 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 2012

바이너리 파일로 작업하는 경우 또는 특정 형식의 줄 끝 (예 : \r\nvs \n)이 중요한 기타 경우에만 필요합니다 . stackoverflow.com/questions/3257869/…를 참조하십시오 . 귀하의 경우에는 윈도우 친화적 인 라인 엔딩을 원하지만 트위터 엔드 포인트에서 가져 오지 못할 수도 있으므로 텍스트 모드로 열어야합니다.
Hamish

이것이 귀하의 질문에 대답합니까? JSON 파일을 prettyprint하는 방법은 무엇입니까?
wesinat0r

답변:


102

선택적 인수를 사용해야합니다 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 2012

1
거기에있을 필요는 없지만 아주 예쁘고 알파벳순으로 정렬됩니다. 사람이 읽을 수있는 출력을 원할 때 사용하는 경향이 있습니다.
mattbornski 2012

4
잘 설명 해주셔서 감사합니다-그러나 & $ & #이 되려고하지 않지만 파일을 쓰기 위해 열거 나 닫는 것은 권장하지 않습니다. 일반적으로 with 구조가 바람직합니다. with open("name_of_file.json", "w") as f: f.write(my_formatted_json_var) 더 큰 스 니펫에서 파일을 닫을 수 있다는 장점이 있습니다. ...
logicOnAbstractions

with구문은 확실히 좋네요,하지만 난 내 관객들에게 내 대답을 확장하려고
mattbornski

73

JSON을 구문 분석 한 다음 다음과 같은 들여 쓰기로 다시 출력 할 수 있습니다.

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

자세한 내용은 http://docs.python.org/library/json.html 을 참조 하십시오 .


@Zelbinian : 네, 여기 well.Take으로 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 2012

5
@Zelbinian- json.dumps문자열을 반환합니다. json.dump파일에 씁니다.
dkamins 2012

65
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 모듈을 사용 하여 예쁜 인쇄를 할 수 있습니다 .

>>> 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 2012

@Zelbinian : 정확히 무엇을 의미 doesn't work as well합니까?
RanRag 2012

1
예쁘게 인쇄 된 Json 구문 대신 Python dict 구문으로 보이는 데이터를 한 줄로 출력했습니다.
Zelbinian

질문의 출력을 편집으로 포함하십시오. 그래서 우리는 그것을 볼 수 있습니다.
RanRag 2012

이것을 사용하면 배열이 각 값의 여러 줄로 나열됩니다. 배열을 한 줄로 유지하는 것이 좋습니다.
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 파일을 수정하는 경우 pretty view json 형식에 "indent"매개 변수를 사용하십시오.

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.