Reputation: 2409
Answered I ended up going with pickle at the end anyway
Ok so with some advice on another question I asked I was told to use pickle to save a dictionary to a file.
The dictionary that I was trying to save to the file was
members = {'Starspy' : 'SHSN4N', 'Test' : 'Test1'}
When pickle saved it to the file... this was the format
(dp0
S'Test'
p1
S'Test1'
p2
sS'Test2'
p3
S'Test2'
p4
sS'Starspy'
p5
S'SHSN4N'
p6
s.
Can you please give me an alternative way to save the string to the file?
This is the format that I would like it to save in
members = {'Starspy' : 'SHSN4N', 'Test' : 'Test1'}
Complete Code:
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")
Upvotes: 49
Views: 92298
Reputation: 1022
Although, unlike pp.pprint(the_dict)
, this won't be as pretty, will be run together, str()
at least makes a dictionary savable in a simple way for quick tasks:
f.write( str( the_dict ) )
Upvotes: 7
Reputation: 38177
You asked
Ill give it a shot. How do I specify what file to dump it to/load it from?
Apart from writing to a string, the json
module provides a dump()
-method, which writes to a file:
>>> a = {'hello': 'world'}
>>> import json
>>> json.dump(a, file('filename.txt', 'w'))
>>> b = json.load(file('filename.txt'))
>>> b
{u'hello': u'world'}
There is a load()
method for reading, too.
Upvotes: 3
Reputation: 35207
While I'd suggest pickle
, if you want an alternative, you can use 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}
With klepto
, if you had used serialized=True
, the dictionary would have been written to memo.pkl
as a pickled dictionary instead of with clear text.
You can get klepto
here: https://github.com/uqfoundation/klepto
dill
is probably a better choice for pickling then pickle
itself, as dill
can serialize almost anything in python. klepto
also can use dill
.
You can get dill
here: https://github.com/uqfoundation/dill
Upvotes: 0
Reputation: 57474
The most common serialization format for this nowadays is JSON, which is universally supported and represents simple data structures like dictionaries very clearly.
>>> 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'}
Upvotes: 56
Reputation: 99
The YAML format (via pyyaml) might be a good option for you:
http://en.wikipedia.org/wiki/Yaml
http://pypi.python.org/pypi/PyYAML
Upvotes: 7
Reputation: 154484
Sure, save it as CSV:
import csv
w = csv.writer(open("output.csv", "w"))
for key, val in dict.items():
w.writerow([key, val])
Then reading it would be:
import csv
dict = {}
for key, val in csv.reader(open("input.csv")):
dict[key] = val
Another alternative would be json (json
for version 2.6+, or install simplejson
for 2.5 and below):
>>> import json
>>> dict = {"hello": "world"}
>>> json.dumps(dict)
'{"hello": "world"}'
Upvotes: 60