Сохранить словарь в файл (альтернатива pickle) в Python? - PullRequest
48 голосов
/ 04 февраля 2011

Отвечено В конце концов, я все равно пошел с pickle в конце

Хорошо, поэтому с некоторыми советами по другому вопросу, который я задал, мне сказали использовать pickle для сохранения словаря в файл.

Словарь, который я пытался сохранить в файл, был

members = {'Starspy' : 'SHSN4N', 'Test' : 'Test1'}

Когда Pickle сохранил его в файл ... это был формат

(dp0
S'Test'
p1
S'Test1'
p2
sS'Test2'
p3
S'Test2'
p4
sS'Starspy'
p5
S'SHSN4N'
p6
s.

Не могли бы вы дать мне альтернативный способ сохранить строку в файл?

Это формат, который я хотел бы сохранить в

members = {'Starspy': 'SHSN4N', 'Test': 'Test1'}

Полный код:

import sys
import shutil
import os
import pickle

tmp = os.path.isfile("members-tmp.pkl")
if tmp == True:
    os.remove("members-tmp.pkl")
shutil.copyfile("members.pkl", "members-tmp.pkl")

pkl_file = open('members-tmp.pkl', 'rb')
members = pickle.load(pkl_file)
pkl_file.close()

def show_menu():
    os.system("clear")
    print "\n","*" * 12, "MENU", "*" * 12
    print "1. List members"
    print "2. Add member"
    print "3. Delete member"
    print "99. Save"
    print "0. Abort"
    print "*" * 28, "\n"
    return input("Please make a selection: ")

def show_members(members):
    os.system("clear")
    print "\nNames", "     ", "Code"
    for keys in members.keys():
        print keys, " - ", members[keys]

def add_member(members):
    os.system("clear")
    name = raw_input("Please enter name: ")
    code = raw_input("Please enter code: ")
    members[name] = code
    output = open('members-tmp.pkl', 'wb')
    pickle.dump(members, output)
    output.close()
    return members


#with open("foo.txt", "a") as f:
#     f.write("new line\n")

running = 1

while running:
    selection = show_menu()
    if selection == 1:
        show_members(members)
        print "\n> " ,raw_input("Press enter to continue")
    elif selection == 2:
        members == add_member(members)
        print members
        print "\n> " ,raw_input("Press enter to continue")
    elif selection == 99:
        os.system("clear")
        shutil.copyfile("members-tmp.pkl", "members.pkl")
        print "Save Completed"
        print "\n> " ,raw_input("Press enter to continue")

    elif selection == 0:
        os.remove("members-tmp.pkl")
        sys.exit("Program Aborted")
    else:
        os.system("clear")
        print "That is not a valid option!"
        print "\n> " ,raw_input("Press enter to continue")

Ответы [ 6 ]

60 голосов
/ 04 февраля 2011

Конечно, сохраните его как CSV:

import csv
w = csv.writer(open("output.csv", "w"))
for key, val in dict.items():
    w.writerow([key, val])

Тогда прочитайте его так:

import csv
dict = {}
for key, val in csv.reader(open("input.csv")):
    dict[key] = val

Другой альтернативой будет json (json для версии 2.6+ или установитеsimplejson для 2,5 и ниже):

>>> import json
>>> dict = {"hello": "world"}
>>> json.dumps(dict)
'{"hello": "world"}'
53 голосов
/ 04 февраля 2011

Наиболее распространенным форматом сериализации для этого в настоящее время является JSON, который поддерживается повсеместно и очень четко представляет простые структуры данных, такие как словари.

>>> members = {'Starspy' : 'SHSN4N', 'Test' : 'Test1'}
>>> json.dumps(members)
'{"Test": "Test1", "Starspy": "SHSN4N"}'
>>> json.loads(json.dumps(members))
{u'Test': u'Test1', u'Starspy': u'SHSN4N'}
7 голосов
/ 01 февраля 2014

Хотя, в отличие от pp.pprint(the_dict), он не будет таким красивым, будет работать вместе, str(), по крайней мере, делает словарь простым и удобным для быстрых задач:

f.write( str( the_dict ) )
7 голосов
/ 04 февраля 2011

Формат YAML (через pyyaml) может быть хорошим вариантом для вас:

http://en.wikipedia.org/wiki/Yaml

http://pypi.python.org/pypi/PyYAML

3 голосов
/ 06 ноября 2015

Ты спросил

Я попробую. Как мне указать, из какого файла его выгружать / загружать?

Помимо записи в строку, модуль json предоставляет метод dump(), который записывает в файл:

>>> a = {'hello': 'world'}
>>> import json
>>> json.dump(a, file('filename.txt', 'w'))
>>> b = json.load(file('filename.txt'))
>>> b
{u'hello': u'world'}

Существует также способ чтения load().

0 голосов
/ 27 января 2014

Хотя я бы предложил pickle, если вы хотите альтернативу, вы можете использовать klepto.

>>> init = {'y': 2, 'x': 1, 'z': 3}
>>> import klepto
>>> cache = klepto.archives.file_archive('memo', init, serialized=False)
>>> cache        
{'y': 2, 'x': 1, 'z': 3}
>>>
>>> # dump dictionary to the file 'memo.py'
>>> cache.dump() 
>>> 
>>> # import from 'memo.py'
>>> from memo import memo
>>> print memo
{'y': 2, 'x': 1, 'z': 3}

С klepto, если бы вы использовали serialized=True, словарь был бы записан в memo.pkl как маринованный словарь, а не с открытым текстом.

Вы можете получить klepto здесь: https://github.com/uqfoundation/klepto

dill, вероятно, является лучшим выбором для засолки, чем сам pickle, поскольку dill может сериализовать почти все в Python. klepto также можно использовать dill.

Вы можете получить dill здесь: https://github.com/uqfoundation/dill

...