2012-08-02 2 views
11

목록이 비어 있거나 비어있을 수 있습니다.목록이 비어있는 경우에도 json 객체에서 json 객체를 강제로 덤프합니다.

사람이 읽을 수 있고 다음 스크립트를 구문 분석하기 쉬운 형식으로 목록을 포함하는 새 파일을 만들고 싶습니다. 목록이 비어 있지 않은 경우에는 잘 작동하고 다음 스크립트는 json 파일을 읽습니다. 그러나 목록이 비어 있으면 "ValueError : No JSON 객체를 디코딩 할 수 있습니다."라는 메시지가 나타납니다. 이는 파일을 열 때 실제로 내용이 없으므로 JSON 객체가 없기 때문에 의미가 있습니다.

일부 목록이 비어있어 괜찮습니다. 그래서, 비어있는 JSON 객체를 쓰고 싶습니다. 또는 독자 스크립트가 JSON 객체를 찾지 못해도 괜찮기를 바랍니다.

작가 스크립트

favColor = [] OR favColor = ['blue'] OR favColor = ['blue', 'green'] 
fileName = 'favoriteColor.json' 
outFile = open(fileName, 'w') 
json.dump(outFile, favColor) 
outFile.close() 

리더 스크립트

fileName = 'favoriteColor.json' 
inFile = open(fileName, 'r') 
colors = json.load(inFile) 
inFile.close() 

어떤 도움이나 제안이 많이 감사 :

다음은 관련 코드입니다. 내가 왜이 일을하는지 더 이유를 제시 할 필요가 있다면, 그 문제를 이해하는 데 필요한 최소한으로 시작한다고 생각할 수도 있습니다.

답변

15

이에 당신의 독자 스크립트를 수정 :

with open('favoriteColor.json') as inFile: 
    try: 
     colors = json.load(inFile) 
    except ValueError: 
     colors = [] 

이는 JSON으로 파일을로드하려고 시도합니다. 값 오류로 인해 실패하면 json이 비어 있기 때문입니다. 따라서 빈 목록에 색상을 할당 할 수 있습니다. 자동으로 파일을 닫으므로 파일을로드하려면 "with"구문을 사용하는 것이 좋습니다.

+0

깔끔하고 깨끗함 +1 –

+0

감사합니다. 감사합니다. 왜 "open ... with as ..."이 선호되는 지에 대한 좋은 설명입니다. 나는 사람들이 그것이 전에 선호한다고 말한 것을 들었다. 그러나 이유없이 그것은 나를 변화시키지 못했다. – rcorty

2

나는 당신이 시도하는 접근 방식을 취하지 않을 것입니다. 내가 대신 json.dump 사전, 예를 들면 다음과 같습니다

d = {'var1': '123', 'var2': [1, 2, 3]} 
json.dump(d, fileout) 

그런 다음 적절한 값으로 기본값으로 dict.get를 사용

json_dict = json.load(filein) 
favColor = json_dict.get('favColor', []) 

그런 다음 당신은 아직도 [] 표기법을 사용하여 존재하지 않는 경우를 제외시켰다 수 의무적으로 값이 있습니다.

json.dump({'favorite-color': favColor}, outFile) 
outFile.close() 

을 그리고 경우를 처리 :

2

당신은 또한 당신의 JSON 파일에서 변수의 이름을 추가 할 수 있습니다 .. 대신 JSON 파서의 코드에서 누락 된 값의 논리를 둔다 당신은 당신이 json.dump에 다음 파일 - 류의 객체를 저장하고 할 개체를 제공해야합니다

data = json.load(inFile) 

if len(data['favorite-color']) == 0: 
    ... 

주 : 빈 목록으로 JSON 파일을 읽을 때.

관련 문제