2012-06-25 18 views
9

Mongodb'a yüklemem gereken bir json dosyasına (~ 3Gb) sahibim. Oldukça az sayıda json anahtarı içerir. (nokta), bu da yükün mongodb'a dönüşmesine neden olur. Json dosyasını yüklemek ve işlemdeki anahtar isimleri düzenlemek istiyorum, diyelim ki boş bir alan ile nokta değiştirin.Python'da json.load sırasında tuşları nasıl düzenleyebilir/yeniden adlandırabilirim?

import json 

def RemoveDotKey(dataPart): 
    for key in dataPart.iterkeys(): 
     new_key = key.replace(".","") 
     if new_key != key: 
      newDataPart = deepcopy(dataPart) 
      newDataPart[new_key] = newDataPart[key] 
      del newDataPart[key] 
      return newDataPart 
    return dataPart 

new_json = json.loads(data, object_hook=RemoveDotKey) 

RemoveDotKey tüm tuşların üzerinde yineleme gerektiğini denilen object_hook, bir anahtar bir nokta içeren aşağıdaki piton kodu kullanarak, bir kopyasını oluşturmak boşlukla nokta değiştirin ve kopya dönün. DataPart'ın tuşlarının üzerinde yineleme yapıp yapamayacağımı ve aynı zamanda anahtar/değer çiftlerini ekleyip silemeyeceğime emin olmak için dataPart'ın bir kopyasını oluşturdum.

Burada bir hata var gibi görünüyor, içinde bir nokta bulunan tüm json anahtarları düzenlenmiyor. Json.load'un nasıl çalıştığından emin değilim. Ayrıca piton için yeni

cevap

16

(az bir hafta boyunca kullanıyoruz) Neredeyse vardı: Sadece bir tuşa değiştirirdiniz böylece

import json 

def remove_dot_key(obj): 
    for key in obj.keys(): 
     new_key = key.replace(".","") 
     if new_key != key: 
      obj[new_key] = obj[key] 
      del obj[key] 
    return obj 

new_json = json.loads(data, object_hook=remove_dot_key) 

Sen, döngü içine bir sözlük dönüyorlardı. Ve değerlerin bir kopyasını almanıza gerek yok, sadece anahtarları yeniden adlandırın.

+2

Bu kod, üzerinde yineleme yaparken sözlük güncellenirken sorunlara neden olmaz mı? Ben iterkeys() ' – Duncan

+1

Hmm yerine anahtarların bir listesini yapmak gerektiğini düşündüm, haklısın, kodu güncelledim. –

+2

Nesnenin derin kopyalarını oluşturmamak, json yükleme işlemini önemli ölçüde hızlandırır ve iterkey'leri() anahtarlarla() değiştirmek yerine geçer! Sağol Ned, Duncan. – okaytee

İlgili konular