Bir sözlüğü bir dosyaya nasıl kaydederim?


139

Bir dict değerini değiştirme ve dict'i bir metin dosyasına kaydetme konusunda sorunum var (format aynı olmalı), sadece member_phonealanı değiştirmek istiyorum .

Metin dosyam şu biçimde:

memberID:member_name:member_email:member_phone

ve ben metin dosyasını bölüyorum:

mdict={}
for line in file:
    x=line.split(':')
    a=x[0]
    b=x[1]
    c=x[2]
    d=x[3]
    e=b+':'+c+':'+d

    mdict[a]=e

member_phoneDepolananı değiştirmeye çalıştığımda d, değer anahtardan değil,

def change(mdict,b,c,d,e):
    a=input('ID')
    if a in mdict:
        d= str(input('phone'))
        mdict[a]=b+':'+c+':'+d
    else:
        print('not')

ve dikteyi aynı formattaki bir metin dosyasına nasıl kaydedebilirim?

Yanıtlar:


260

Python, sadece bu tür şeyler için turşu modülüne sahiptir .

Bu işlevler neredeyse tüm nesneleri kaydetmek ve yüklemek için ihtiyacınız olan her şeydir:

def save_obj(obj, name ):
    with open('obj/'+ name + '.pkl', 'wb') as f:
        pickle.dump(obj, f, pickle.HIGHEST_PROTOCOL)

def load_obj(name ):
    with open('obj/' + name + '.pkl', 'rb') as f:
        return pickle.load(f)

Bu işlevler obj, geçerli çalışma dizininizde nesneleri depolamak için kullanılacak bir klasörünüz olduğunu varsayar .

Bunun pickle.HIGHEST_PROTOCOLher zaman uygun olmayan, ancak performans için iyi olan bir ikili biçim olduğunu unutmayın . Protokol 0bir metin biçimidir.

Python koleksiyonlarını kaydetmek için raf modülü var.


1
save_objdosyanın obj/'+ name + '.pklzaten var olmasını gerektiriyor gibi görünüyor . Adında bir sözlük oluşturdum Q, doldurdum ve aramayı save_obj(Q, "Qtable")yaptım Bir hata aldım: FileNotFoundError: [Errno 2] No such file or directory: 'obj/Qtable.pkl'Dosyaya yazmadan önce dosyayı ilk etapta nasıl oluştururum?
Kürdan Anemon

1
@ToothpickAnemone wb+dosya oluşturmak için kullanılır , yani:with open('obj/'+ name + '.pkl', 'wb+')
andrey.s

1
@ andrey.s: Söylediklerinin herhangi bir fark yaratacağını sanmıyorum çünkü bu sorunu çözmüyor.
martineau

1
@ Diş Anemon: Modda a eklemenin +sorununuzu etkilemeyecektir (andrey.s yanlış). Senin sorunun bir ya da iki şey yüzünden geliyor. İçin save_obj()çalışmalarına bu yanıtında, adlı bir alt dizin "obj"gerekir zaten mevcut çünkü open()otomatik tane oluşturmaz. İkincisi, ilk argüman save_obj()kaydedilecek Python nesnesidir, alt dizinin adı değil ( Qörnek save_obj(Q, "Qtable")çağrısında ne demek istediğinizi tam olarak açıklamasa da ). Henüz çıkmıyorsa bir dizin oluşturabilirsiniz os.mkdir().
martineau

168

Turşu muhtemelen en iyi seçenektir, ancak herhangi birinin NumPy kullanarak bir sözlüğün bir dosyaya nasıl kaydedileceğini ve yükleneceğini merak etmesi durumunda:

import numpy as np

# Save
dictionary = {'hello':'world'}
np.save('my_file.npy', dictionary) 

# Load
read_dictionary = np.load('my_file.npy',allow_pickle='TRUE').item()
print(read_dictionary['hello']) # displays "world"

FYI: NPY dosya görüntüleyicisi


4
.item () ne için?
Gülzar

Bu cevap neden @Zah'ın "turşu" cevabından daha az onaylandı? Daha fazla alan kompleksi mi?
Nathan

1
@frank olasılığı, turşu numpy'nin bağımsız bir proje olduğu python'un standart kütüphanesinin bir parçasıdır.
Maxim Veksler

2
@Gulzar, aradığım şeyden np.load bir ndarray döndürüyor (böyle bir şey yapıyor type(read_dictionary)) ve .item () temel olarak bu öğeyi burada
abhyudayasrinet

2
@ Numpy paketini yüklediniz mi?
Eben

26

Ayrıcajson , sözlüklerin veya diğer bazı verilerin JSON biçimine kolayca eşleştirilebildiği durumlarda modülü de kullanabiliriz .

import json

# Serialize data into file:
json.dump( data, open( "file_name.json", 'w' ) )

# Read data from file:
data = json.load( open( "file_name.json" ) )

Bu çözüm pek çok yarar getirir , örneğin için çalışmalarını Python 2.x ve Python 3.x değişmemiş formda kaydedilir ve ek olarak, veri JSON edilebilir formatta kolayca birçok farklı platformlar veya programlar arasında transfer . Bu veriler aynı zamanda insan tarafından okunabilir .


İyi yaklaşım, ancak openoluşturduğu bir bağlam yerine doğrudan kullanmanın güvenli olduğunu düşünmüyorum with. Bir teminat var mı, json.dumpbaşarısız olursa dosya tanıtıcısı kapatılacak mı ?
Dr_Zaszuś

18

İlk sorunuzun ne olduğundan emin değilim, ancak bir sözlüğü dosyaya kaydetmek istiyorsanız jsonkütüphaneyi kullanmalısınız . Load ve put fonksiyonlarının belgelerine bakınız.


Neden json? Python sözlüğünü "repr" kullanarak bir dosyaya dökmek daha kolaydır
mguijarr

5
@mguijarr ama geri ayrıştırmak o kadar kolay değil. Ayrıca json elle düzenlemek ve başka bir programa almak kolaydır.
kalhartt

1
John'un önerisini seviyorum - iyi ve basit bir örnek için bu
gönderiye bakın

9

Kaydet ve dosyayı dosyaya yükle:

def save_dict_to_file(dic):
    f = open('dict.txt','w')
    f.write(str(dic))
    f.close()

def load_dict_from_file():
    f = open('dict.txt','r')
    data=f.read()
    f.close()
    return eval(data)

3

Karşılaştığınız gibi bir dizgiler sözlüğü için, bu yalnızca Python'un yerleşik metin işleme yetenekleri kullanılarak yapılabilir.

(Değerler başka bir şeyse bunun işe yaramayacağını unutmayın.)

with open('members.txt') as file:
    mdict={}
    for line in file:
        a, b, c, d = line.strip().split(':')
        mdict[a] = b + ':' + c + ':' + d

a = input('ID: ')
if a not in mdict:
    print('ID {} not found'.format(a))
else:
    b, c, d = mdict[a].split(':')
    d = input('phone: ')
    mdict[a] = b + ':' + c + ':' + d  # update entry
    with open('members.txt', 'w') as file:  # rewrite file
        for id, values in mdict.items():
            file.write(':'.join([id] + values.split(':')) + '\n')

Bu sözlüklerde çalışmaz: file.write (':'. Join ([id] + değerleri.split (':')) + '\ n') AttributeError: 'dict' nesnesinin 'split' özelliği yok
Shai Alon

@ShaiAlon: Hepsiyle değil, hayır. Kesinlikle yok , değerleri, (a sahip dizeleri olanlarla çalışmayı split()Bu sorunun konudur -ki yöntemi). Bir sözlük sözlüğünde kullanmaya çalıştığınız anlaşılıyor, bu yüzden hayır onlarla çalışmaz. Ayrıca, milletten aldıkları oyları da takdir etmiyorum çünkü soruyu gerçekten anlamıyorlar (ve dolayısıyla verilen cevapların bağlamı). Kullanırken uygun olması için cevabımı güncelleyeceğim, bu yüzden lütfen oyunuzu geri alın.
martineau

3

JSON'un dosyaları insan tarafından okunabilir olduğundan, verileriniz küçük olduğundan hata ayıklamayı kolaylaştırır. JSON dosyaları diğer programlar tarafından veri okumak ve yazmak için de kullanılır. Burada daha fazla bilgi edinebilirsiniz

JSON modülünü kurmanız gerekir, bunu pip ile yapabilirsiniz:

pip install json


# To save the dictionary into a file:
json.dump( data, open( "myfile.json", 'w' ) )

Bu, dosyam adıyla bir json dosyası oluşturur.

# To read data from file:
data = json.load( open( "myfile.json" ) )

Bu, myfile.json verilerini bir veri nesnesinde okur ve saklar.


2

Sözlüğü gerçekten tutmak istemiyorsanız, en iyi çözümün csvdosyayı okumak için Python modülünü kullanmak olduğunu düşünüyorum . Ardından, veri satırları alırsınız ve istediğinizi member_phoneveya istediğinizi değiştirebilirsiniz ; son olarak, csvdosyayı açtığınız formatta kaydetmek için modülü tekrar kullanabilirsiniz .

Okuma kodu:

import csv

with open("my_input_file.txt", "r") as f:
   reader = csv.reader(f, delimiter=":")
   lines = list(reader)

Yazım kodu:

with open("my_output_file.txt", "w") as f:
   writer = csv.writer(f, delimiter=":")
   writer.writerows(lines)

Tabii ki, change()işlevinizi uyarlamanız gerekir :

def change(lines):
    a = input('ID')
    for line in lines:
      if line[0] == a:
        d=str(input("phone"))
        line[3]=d
        break
    else:
      print "not"

ne demekOf course, you need to adapt your change() function:
kRazzy R

1
soruda, a dict kullanılırken csv daha çok bir liste gibi çalışır
mguijarr

1

Zamanlamadım ama bahse girerim h5 turşudan daha hızlıdır; sıkıştırılmış dosya boyutu neredeyse kesinlikle daha küçüktür.

import deepdish as dd
dd.io.save(filename, {'dict1': dict1, 'dict2': dict2}, compression=('blosc', 9))

-2

Hızlı ve kirli çözüm: dikteyi dizeye dönüştürün ve dosyaya kaydedin, örneğin:

#dict could be anything:

savedict = open('savedict001.txt', 'w')
savedict.write(str(dict))
savedict.close()

Dikteyi str'ye dönüştürme ve kaydetme, özellikle dizelerde anahtarlarınız olarak pd.Series veya np.ndarray'ınız olduğunda çalışmaz.
Arpan Srivastava
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.