2011-02-04 28 views
44

đáp tôi đã kết thúc đi với dưa ở cuối nàoLưu từ điển vào một tệp (thay thế cho dưa chuột) bằng Python?

Ok như vậy với một số lời khuyên về một câu hỏi khác tôi hỏi tôi đã nói để sử dụng dưa để cứu một cuốn từ điển vào một tập tin.

Từ điển mà tôi đã cố gắng để lưu vào tập tin đã

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

Khi dưa lưu nó vào tập tin ... Đây là định dạng

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

Bạn có thể xin vui lòng cho tôi một cách khác để lưu chuỗi vào tệp?

Đây là định dạng mà tôi muốn nó để tiết kiệm trong

members = { 'Starspy': 'SHSN4N', 'thử nghiệm': 'Test1'}

Hoàn thành 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") 
+2

Có gì sai với định dạng? Bạn muốn nó như thế nào? –

+0

Tôi muốn lưu thành từ điển thông thường Ví dụ: members = {'Starspy': 'SHSN4N', 'Test': 'Test1'} – wKavey

+1

Xem [Lưu trữ từ điển Python] (http://stackoverflow.com/q/7100125/562769) –

Trả lời

58

chắc chắn, lưu nó dưới dạng CSV:

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

Sau đó đọc nó sẽ là:

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

Một lựa chọn khác sẽ là json (json cho phiên bản 2.6+, hoặc cài đặt simplejson cho 2.5 trở xuống):

>>> import json 
>>> dict = {"hello": "world"} 
>>> json.dumps(dict) 
'{"hello": "world"}' 
+0

Cảm ơn, bạn vẫn có thể nhập .csv các tập tin? – wKavey

+0

Yup, xem chỉnh sửa của tôi. –

+0

Oh wow điều này hoạt động như xa như tôi có thể nói. Cảm ơn nhiều lắm! – wKavey

6

Định dạng YAML (thông qua pyyaml) có thể là một lựa chọn tốt cho bạn:

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

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

+1

Đó là một ý tưởng tuyệt vời Vấn đề duy nhất là nó đòi hỏi một mô-đun bên ngoài –

+1

Yep. Sự phụ thuộc bên ngoài là một mối phiền toái, nhưng YAML rất dễ thương. :) –

52

Định dạng tuần tự phổ biến nhất cho ngày nay là JSON, được hỗ trợ phổ biến và đại diện cho các cấu trúc dữ liệu đơn giản như từ điển rất rõ ràng.

>>> 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'} 
+2

Hãy cho nó một bức ảnh. Làm thế nào để tôi xác định những tập tin để đổ nó vào/tải nó từ? – wKavey

+9

Dump trả về một chuỗi. Bạn chỉ có thể viết nó vào bất kỳ tập tin nào như bình thường python IO 'với mở ('file.json', 'w') là f: f.write (json.dumps (thành viên))' –

+0

u là gì trong json tải định dạng? –

0

Trong khi tôi muốn đề nghị pickle, nếu bạn muốn một sự thay thế, bạn có thể sử dụng 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} 

Với klepto, nếu bạn đã sử dụng serialized=True, từ điển sẽ được ghi vào memo.pkl như một cuốn từ điển ngâm thay vì với văn bản rõ ràng.

Bạn có thể nhận klepto đây: https://github.com/uqfoundation/klepto

dill có lẽ là một lựa chọn tốt hơn cho tẩy sau đó pickle chính nó, như dill thể serialize hầu hết mọi thứ trong python. klepto cũng có thể sử dụng dill.

Bạn có thể nhận dill đây: https://github.com/uqfoundation/dill

6

Mặc dù, không giống như pp.pprint(the_dict), điều này sẽ không được như xinh đẹp, sẽ được chạy với nhau, str() ít nhất làm cho một cuốn từ điển savable một cách đơn giản cho các nhiệm vụ nhanh chóng:

f.write(str(the_dict)) 
+0

Vì Python 3.2, đối tượng chuỗi đã lưu này có thể được nhập bằng ['ast.literal_eval'] (https://docs.python.org/3/library/ast.html#ast.literal_eval) – Chris

3

Bạn asked

Ill cho nó một shot. Làm thế nào để tôi xác định những tập tin để đổ nó vào/tải nó từ?

Ngoài văn bản cho một chuỗi, các mô-đun json cung cấp một -method dump(), mà viết vào một tệp:

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

Có một phương pháp load() cho việc đọc, quá.

Các vấn đề liên quan