1
def createdictionary():
    mydictionary = dict()
    mydictionary['Computer']='Computer is an electronic machine.'
    mydictionary['RAM']='Random Access Memory'
    return mydictionary

def insert(dictionary):
    print("Enter the keyword you want to insert in the dictionary: ")
    key=input()
    print("Enter its meaning")
    meaning=input()
    dictionary[key]=meaning
    f = open('dict_bckup.txt','a')
    f.write(key)
    f.write('=')
    f.write(meaning)
    f.write(';\n')
    f.close()
    print("Do you want to insert again? y/n")
    ans=input()
    if ( ans == 'y' or ans=='Y' ):
        insert(dictionary)

def display(dictionary):
    print("The contents of the dictionary are : ")
    f = open('dict_bckup.txt','r')
    print(f.read())
    f.close()

def update(dictionary):
    print("Enter the word whose meaning you want to update")
    key=input()
    #i want to edit the meaning of the key in the text file
    f = open('dict_bckup.txt','w')
    if key in dictionary:
        print(dictionary[key])
        print("Enter its new meaning: ")
        new=input()
        dictionary[key]=new
    else:
        print("Word not found! ")
    print("Do you want to update again? y/n")
    ans=input()
    if (ans=='y' or ans=='Y'):
        update(dictionary)

def search(dictionary):
    print("Enter the word you want to search: " )
    word=input()
    if word in dictionary:
        print(dictionary[word])

else:
    print("Word not found! ")
print("Do you want to search again? y/n")
ans=input()
if(ans=='y' or ans=='Y'):
    search(dictionary)


def delete(dictionary):
    print("Enter the word you want to delete: ")
    word=input()
    if word in dictionary:
        del dictionary[word]
        print(dictionary)
    else:
        print("Word not found!")

    print("Do you want to delete again? y/n ")
    ans=input()
    if ( ans == 'y' or ans == 'Y' ):
        delete(dictionary)

def sort(dictionary):
    for key in sorted(dictionary):
        print(" %s: %s "%(key,(dictionary[key])))


def main():
    dictionary=createdictionary()
    while True:

        print("""             Menu
            1)Insert
            2)Delete
            3)Display Whole Dictionary
            4)Search
            5)Update Meaning
            6)Sort
            7)Exit
          Enter the number to select the coressponding field """)

        ch=int(input())

        if(ch==1):
            insert(dictionary)

        if(ch==2):
            delete(dictionary)

        if(ch==3):
            display(dictionary)

        if(ch==4):
            search(dictionary)

        if(ch==5):
            update(dictionary)

        if(ch==6):
            sort(dictionary)

        if(ch==7):                                        
            break


main()

私はpythonが初めてです。私はこれを手に入れるために何日も努力してきました。しかし、まだ解決策は見つかりませんでした。問題は、最初に、単語とその意味を保存する簡単な辞書プログラムを作成したことです。それから、単語を永久に保存する必要があると思いました。単語をテキストファイルに保存して表示しようとしました。しかし、テキストファイル内の単語を検索する方法がわかりません。そして、単語を見つけて、その意味を更新したいとします。では、どうすればよいのでしょうか。「w」を使用してテキストファイル全体を書き換えると、書き換えられます。また、どのように削除すればよいですか。ファイルのテキストに単語を挿入した方法も間違っていることはわかっています。これで私を助けてください。

4

3 に答える 3

1

@Vaibhav Desaiが言及したように、定期的に辞書全体を書くことができます。たとえば、シリアライズされたオブジェクトを書き込むpickle モジュールを考えてみましょう:

import pickle

class MyDict(object):
    def __init__(self, f, **kwargs):
        self.f = f
        try:
            # Try to read saved dictionary
            with open(self.f, 'rb') as p:
                self.d = pickle.load(p)
        except:
            # Failure: recreating
            self.d = {}
        self.update(kwargs)

    def _writeback(self):
        "Write the entire dictionary to the disk"
        with open(self.f, 'wb') as p:
            pickle.dump(p, self.d)

    def update(self, d):
        self.d.update(d)
        self._writeback()

    def __setitem__(self, key, value):
        self.d[key] = value
        self._writeback()

    def __delitem__(self, key):
        del self.d[key]
        self._writeback()

    ...

これは、変更を行うたびにディクショナリ全体をディスクに書き換えます。これは場合によっては意味があるかもしれませんが、おそらく最も効率的ではありません。_writebackまた、定期的に呼び出す、または明示的に呼び出す必要がある、より巧妙なメカニズムを作成することもできます。

他の人が示唆しているように、ディクショナリに多くの書き込みが必要な場合は、sqlite3 モジュールを使用して、SQL テーブルをディクショナリとして使用することをお勧めします。

import sqlite3

class MyDict(object):
    def __init__(self, f, **kwargs):
        self.f = f
        try:
            with sqlite3.connect(self.f) as conn:
                conn.execute("CREATE TABLE dict (key text, value text)")
        except:
            # Table already exists
            pass

    def __setitem__(self, key, value):
        with sqlite3.connect(self.f) as conn:
            conn.execute('INSERT INTO dict VALUES (?, ?)', str(key), str(value))

    def __delitem__(self, key):
        with sqlite3.connect(self.f) as conn:
            conn.execute('DELETE FROM dict WHERE key=?', str(key))

    def __getitem__(self, key):
        with sqlite3.connect(self.f) as conn:
            key, value = conn.execute('SELECT key, value FROM dict WHERE key=?', str(key))
            return value

    ...

これは単なる例です。たとえば、接続を開いたままにし、明示的に閉じるように要求したり、クエリをキューに入れたりすることができます...しかし、データをディスクに永続化する方法の大まかなアイデアが得られるはずです。

一般に、Python ドキュメントのData Persistenceセクションは、問題に最も適したモジュールを見つけるのに役立ちます。

于 2013-10-02T11:39:37.677 に答える
0

まず第一に、ディクショナリに更新または挿入が発生するたびにディスクに書き込むことは非常に悪い考えです。プログラムは単純に I/O を使いすぎます。したがって、より簡単な方法は、キーと値のペアをディクショナリに保存し、プログラムの終了時または一定の時間間隔でディスクに保存することです。

また、人間が読める形式 (プレーン テキスト ファイルなど) でディスクにデータを保存することに熱心でない場合。ここに示すように、組み込みの pickle モジュールを使用して、明確に定義されたディスクの場所にデータを保存することを検討できます。したがって、プログラムの起動時に、この適切に定義された場所から読み取り、データを辞書オブジェクトに戻すことができます。このようにして、辞書オブジェクトのみを操作でき、アイテムの検索やアイテムの削除などの操作も簡単に実行できます。要件を解決する以下のスクリプトを参照してください。pickleモジュールを使用してファイルに永続化しました。テキスト ファイルにダンプして、別の演習としてそこから読み取ることができます。また、たとえば、サフィックス2を使用して関数を導入していませんあなたの関数を私のものと比較して違いを理解できるようにinsert2 :

もう 1 つ - プログラムにバグがありました。ユーザー入力を読み込むには、input() ではなく raw_input() を使用する必要があります。

import pickle
import os

def createdictionary():
    mydictionary = dict()
    mydictionary['Computer']='Computer is an electronic machine.'
    mydictionary['RAM']='Random Access Memory'
    return mydictionary

#create a dictionary from a dump file if one exists. Else create a new one in memory.    
def createdictionary2():

    if os.path.exists('dict.p'):
        mydictionary = pickle.load(open('dict.p', 'rb'))
        return mydictionary

    mydictionary = dict()
    mydictionary['Computer']='Computer is an electronic machine.'
    mydictionary['RAM']='Random Access Memory'
    return mydictionary

def insert(dictionary):
    print("Enter the keyword you want to insert in the dictionary: ")
    key=raw_input()
    print("Enter its meaning")
    meaning=raw_input()
    dictionary[key]=meaning
    f = open('dict_bckup.txt','a')
    f.write(key)
    f.write('=')
    f.write(meaning)
    f.write(';\n')
    f.close()
    print("Do you want to insert again? y/n")
    ans=raw_input()
    if ( ans == 'y' or ans=='Y' ):
        insert(dictionary)

#custom method that simply updates the in-memory dictionary
def insert2(dictionary):
    print("Enter the keyword you want to insert in the dictionary: ")
    key=raw_input()
    print("Enter its meaning")
    meaning=raw_input()
    dictionary[key]=meaning

    print("Do you want to insert again? y/n")
    ans=raw_input()
    if ( ans == 'y' or ans=='Y' ):
        insert(dictionary)



def display(dictionary):
    print("The contents of the dictionary are : ")
    f = open('dict_bckup.txt','r')
    print(f.read())
    f.close()

#custom display function - display the in-mmeory dictionary
def display2(dictionary):
    print("The contents of the dictionary are : ")
    for key in dictionary.keys():
        print key + '=' + dictionary[key] 

def update(dictionary):
    print("Enter the word whose meaning you want to update")
    key=input()
    #i want to edit the meaning of the key in the text file
    f = open('dict_bckup.txt','w')
    if key in dictionary:
        print(dictionary[key])
        print("Enter its new meaning: ")
        new=raw_input()
        dictionary[key]=new
    else:
        print("Word not found! ")
    print("Do you want to update again? y/n")
    ans=input()
    if (ans=='y' or ans=='Y'):
        update(dictionary)

#custom method that performs update of an in-memory dictionary        
def update2(dictionary):
    print("Enter the word whose meaning you want to update")
    key=input()
    #i want to edit the meaning of the key in the text file

    if key in dictionary:
        print(dictionary[key])
        print("Enter its new meaning: ")
        new=raw_input()
        dictionary[key]=new
    else:
        print("Word not found! ")
    print("Do you want to update again? y/n")
    ans=raw_input()
    if (ans=='y' or ans=='Y'):
        update(dictionary)

def search(dictionary):
    print("Enter the word you want to search: " )
    word=raw_input()
    if word in dictionary:
        print(dictionary[word])

    else:
        print("Word not found! ")
    print("Do you want to search again? y/n")
    ans=raw_input()
    if(ans=='y' or ans=='Y'):
        search(dictionary)


def delete(dictionary):
    print("Enter the word you want to delete: ")
    word=raw_input()
    if word in dictionary:
        del dictionary[word]
        print(dictionary)
    else:
        print("Word not found!")

    print("Do you want to delete again? y/n ")
    ans=raw_input()
    if ( ans == 'y' or ans == 'Y' ):
        delete(dictionary)

def sort(dictionary):
    for key in sorted(dictionary):
        print(" %s: %s "%(key,(dictionary[key])))

#this method will save the contents of the in-memory dictionary to a pickle file
#of course in case the data has to be saved to a simple text file, then we can do so too
def save(dictionary):
    #open the dictionary in 'w' mode, truncate if it already exists
    f = open('dict.p', 'wb')
    pickle.dump(dictionary, f)




def main():
    dictionary=createdictionary2() #call createdictionary2 instead of creatediction
    while True:

        print("""             Menu
            1)Insert
            2)Delete
            3)Display Whole Dictionary
            4)Search
            5)Update Meaning
            6)Sort
            7)Exit
          Enter the number to select the coressponding field """)

        ch=int(input())

        if(ch==1):
            insert2(dictionary)  #call insert2 instead of insert

        if(ch==2):
            delete(dictionary)

        if(ch==3):
            display2(dictionary) #call display2 instead of display

        if(ch==4):
            search(dictionary)

        if(ch==5):
            update2(dictionary) #call update2 instead of update

        if(ch==6):
            sort(dictionary)

        if(ch==7):                                        
            #save the dictionary before exit
            save(dictionary);
            break


main()
于 2013-10-02T11:48:02.703 に答える
0

その通りです。これらの値を単純なテキスト ファイルに保存するのは、よくありません。1 つの単語を更新したい場合は、ファイル全体を書き直さなければなりません。また、1 つの単語を検索する場合、ファイル内のすべての単語を検索することになる場合があります。

ディクショナリ用に特別に設計されたデータ構造 (トライ ツリーなど) がいくつかありますが、ディクショナリがそれほど大きくないと仮定すると、sqlite データベースを使用できます。Python には sqlite3 ライブラリがあります。詳細については、ドキュメントを確認してください。

于 2013-10-02T11:20:28.620 に答える