2013-10-05 4 views
54

У меня проблема с изменением значения dict и сохранением dict в текстовом файле (формат должен быть таким же), я хочу только изменить поле member_phone.Как сохранить словарь в файле?

Мой текстовый файл в следующем формате:

memberID:member_name:member_email:member_phone 

и я разделить текстовый файл с:

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_phone хранится в d, значение изменилось не течет по ключу,

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') 

и как сохранить dict t o текстовый файл с таким же форматом?

ответ

7

Я не уверен, что ваш первый вопрос, но если вы хотите сохранить словарь в файл, вы, вероятно, должны использовать библиотеку json. Посмотрите документацию о нагрузках и поставьте функции.

+0

Почему json? Еще проще просто сбрасывать словарь Python в файл, используя «repr» – mguijarr

+2

@mguijarr, но разбор его обратно не так прост. Плюс json легко редактировать вручную и импортировать в любую другую программу. – kalhartt

+0

Мне нравится предложение Джона - см. Это сообщение для хорошего и простого примера http://stackoverflow.com/a/11027021/765827 – jacanterbury

119

Python имеет модуль pickle только для такого рода вещей.

Эти функции все, что вам нужно для сохранения и загрузки практически любой объект:

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) 

Эти функции предполагают, что у вас есть obj папку в текущем рабочем каталоге, который будет использоваться для хранения объектов.

Обратите внимание, что pickle.HIGHEST_PROTOCOL - это двоичный формат, который не всегда может быть удобным, но хорош для производительности. Протокол 0 - текстовый формат.

Для сохранения коллекций Python существует модуль shelve.

+0

'save_obj', кажется, требует, чтобы файл' obj/'+ name +' .pkl' уже существовать. Я создал словарь с именем 'Q', заполнил его и сделал вызов' save_obj (Q, «Qtable») 'Я получил ошибку:' FileNotFoundError: [Errno 2] Нет такого файла или каталога: 'obj/Qtable.pkl «Как создать файл в первую очередь, прежде чем писать на него? –

+1

@ToothpickAnemone использует 'wb +' для создания файла, то есть: 'open ('obj /' + name + '.pkl', 'wb +')' –

+0

@ andrey.s: Я не думаю, что вы говорите, любая разница, поскольку она не решает проблему. – martineau

2

Если вы действительно хотите сохранить словарь, я считаю, что лучшим решением является использование модуля Python для чтения файла. Затем вы получаете строки данных, и вы можете изменить member_phone или что хотите; , наконец, вы можете использовать модуль csv еще раз, чтобы сохранить файл в том же формате , когда вы его открыли.

Код для чтения:

import csv 

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

Код для записи:

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

Конечно, вам нужно адаптировать change() функцию:

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" 
+0

Что подразумевается под 'Конечно, вам нужно адаптировать функцию change():' –

+1

в вопросе, использовался 'dict', тогда как csv больше похож на список – mguijarr

3

Вот как это можно сделать используя только встроенные возможности обработки текста Python:

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') 
60

Рассол, вероятно, самый лучший вариант, но в случае, если кто задается вопросом, как сохранить и загрузить словарь в файл с помощью NumPy:

import numpy as np 

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

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

FYI: NPY file viewer

2

Я не приуроченная но я уверен, что h5 быстрее, чем рассол; размер файла с сжатием почти наверняка меньше.

import deepdish as dd 
dd.io.save(filename, {'dict1': dict1, 'dict2': dict2}, compression=('blosc', 9)) 
Смежные вопросы