2012-12-19 2 views
22

기존 Json 파일을 업데이트하려고하지만 어떤 이유로 인해 요청 된 값이 변경되지 않지만 새 값을 가진 전체 값 집합이 원본에 추가됩니다.json 파일을 파이썬으로 업데이트하는 방법

jsonFile = open("replayScript.json", "r+") 
data = json.load(jsonFile) 


tmp = data["location"] 
data["location"] = "NewPath" 

jsonFile.write(json.dumps(data)) 

을 제기하고 그 결과는 다음과 같습니다 필수 : ​​

{ 
    "location": "NewPath", 
    "Id": "0", 
    "resultDir": "", 
    "resultFile": "", 
    "mode": "replay", 
    "className": "", 
    "method": "METHOD" 
} 

실제 :

{ 
"location": "/home/karim/storm/project/storm/devqa/default.xml", 
"Id": "0", 
"resultDir": "", 
"resultFile": "", 
"mode": "replay", 
"className": "", 
"method": "METHOD" 
} 
{ 
    "resultDir": "", 
    "location": "pathaaaaaaaaaaaaaaaaaaaaaaaaa", 
    "method": "METHOD", 
    "className": "", 
    "mode": "replay", 
    "Id": "0", 
    "resultFile": "" 
} 

답변

19
def updateJsonFile(): 
    jsonFile = open("replayScript.json", "r") # Open the JSON file for reading 
    data = json.load(jsonFile) # Read the JSON into the buffer 
    jsonFile.close() # Close the JSON file 

    ## Working with buffered content 
    tmp = data["location"] 
    data["location"] = path 
    data["mode"] = "replay" 

    ## Save our changes to JSON file 
    jsonFile = open("replayScript.json", "w+") 
    jsonFile.write(json.dumps(data)) 
    jsonFile.close() 
38

여기서 문제는 파일을 열고 커서가 파일의 끝에 있도록 내용을 읽었습니다. 동일한 파일 핸들을 작성함으로써 본질적으로 파일에 추가됩니다.

가장 쉬운 해결책은 파일을 읽은 다음 파일을 닫은 다음 다시 쓰는 것입니다.

with open("replayScript.json", "r") as jsonFile: 
    data = json.load(jsonFile) 

tmp = data["location"] 
data["location"] = "NewPath" 

with open("replayScript.json", "w") as jsonFile: 
    json.dump(data, jsonFile) 

다른 방법으로는 다음 새 데이터가 이전보다 작은 경우에 대처하기 위해 truncate() 다음에 쓰기 시작 파일의 시작 부분에 커서를 뒤로 이동 seek()를 사용할 수 있습니다.

with open("replayScript.json", "r+") as jsonFile: 
    data = json.load(jsonFile) 

    tmp = data["location"] 
    data["location"] = "NewPath" 

    jsonFile.seek(0) # rewind 
    json.dump(data, jsonFile) 
    jsonFile.truncate() 
+4

'seek()'과'truncate()'를 사용 해 주셔서 감사합니다. 그러나 나는 'jsonFile.write (json.dumps (data))'를'jsonFile.dump (data, f)'로 변경함으로써이 대답을 향상시킬 것이다. 더 많은 pythonic. – BoltzmannBrain

관련 문제