python - للمبتدئين - كيفية حفظ القاموس إلى ملف؟




كيفية تعلم الرسم الهندسي اليدوي (4)

لدي مشكلة في تغيير قيمة 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')

وكيفية حفظ الوسيلة إلى ملف نصي بنفس التنسيق؟


بيثون لديه وحدة 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 هو تنسيق نص.

لحفظ مجموعات بايثون توجد وحدة shelve .


في ما يلي كيفية إجراء ذلك باستخدام إمكانات معالجة النصوص المضمنة في 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')

لم أقم بتأخير ذلك ، لكنني أراهن على أن h5 أسرع من المخلل. يكاد يكون حجم الملفات مع الضغط أصغر.

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

ما لم ترغب حقا في الاحتفاظ بالقاموس ، أعتقد أن الحل الأفضل هو استخدام وحدة csv 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"




python-3.x