2012-12-19 24 views
22

Varolan Json dosyasını güncellemeye çalışıyorum, ancak herhangi bir nedenden dolayı, istenen değer değiştirilmiyor, ancak tüm değerler kümesi (yeni değerle birlikte) orijinaline ekleniyorpython ile json dosyasını güncelleştirme

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


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

jsonFile.write(json.dumps(data)) 

dosya ve sonucudur: Gerekli:

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

Fiili:

{ 
"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": "" 
} 

cevap

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

Buradaki sorun, bir dosyayı açtığınız ve içeriğini okuduğundan imlecin dosyanın sonunda yer almasıdır. Aynı dosya tanıtıcısına yazarak, aslında dosyaya ekliyorsunuz.

En kolay çözüm, dosyayı okuduktan sonra kapatmak ve sonra yazmak için yeniden açmak olacaktır.

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) 

dilerseniz, daha sonra yeni veri bir önceki daha küçük olması durumunda başa bir truncate() ardından yazmaya başlamak dosyanın başına geri imleci hareket ettirmek için seek() kullanabilirsiniz.

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()' ve 'truncate()' kullanımını açıkladığınız için teşekkür ederiz. Ancak jsonFile.write (json.dumps (data)) 'i' jsonFile.dump (data, f) 'ile değiştirerek bu cevabı iyileştiririm; daha pitonik. – BoltzmannBrain