2013-10-02 3 views
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', чтобы переписать его весь текстовый файл, и он будет перезаписан. И также, как я должен удалить его. Я знаю, как я вставил слово в текст в файле, также неверно. Пожалуйста, помогите мне с этим.Мне нужна помощь в моем словаре программа

+0

Если словарь не слишком велик, вы можете просто кэшировать всю вещь в памяти с помощью карт делают все ваши операции легко и промыть карту (переписать весь файл) на диск через равные промежутки времени. Кстати, на эту тему возможны несколько оптимизаций. Продолжай читать. –

+0

Используйте базу данных sqlite –

ответ

0

Вы правы, сохранение этих значений в простом текстовом файле - плохая идея. Если вы хотите обновить одно слово, вам нужно переписать весь файл. И для поиска одного слова вы можете найти каждое слово в файле.

Существуют некоторые структуры данных, специально предназначенные для словаря (например, Trie tree), но при условии, что ваш словарь на самом деле не очень большой, вы можете использовать базу данных sqlite. Python имеет библиотеку sqlite3. Обратитесь к documentation за дополнительной информацией.

1

Как пояснил @Vaibhav Desai, вы можете написать весь словарь через регулярные промежутки времени. Рассмотрим, например picklemodule который пишет сериализованные объекты:

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 через определенные промежутки времени или требует, чтобы он вызывался явно.

Как и другие предложили, если вам требуется много записей в словаре, вы бы лучше использовать sqlite3module, чтобы иметь таблицу 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 может помочь вам найти наиболее подходящий модуль для вашей проблемы.

0

Прежде всего, запись на диск каждый раз, когда обновление или вставка происходит со словарем - очень плохая идея - ваша программа просто использует слишком много ввода-вывода. Следовательно, более простой способ сделать это - сохранить пары ключ-значение в словаре и сохранить их на диск либо при выходе из программы, либо в некоторый регулярный промежуток времени.

Также, если вы не хотите хранить данные на диске в форме, удобной для чтения (например, текстовый файл); вы можете использовать встроенный модуль рассола, как показано на рисунке here, чтобы сохранить данные в определенном месте на диске. Следовательно, во время запуска программы вы можете читать из этого четко определенного местоположения и «распутать» данные обратно в объект словаря. Таким образом, вы можете работать исключительно со словарным объектом, и даже операции, такие как поиск элемента или удаление элемента, могут быть выполнены легко. Пожалуйста, обратитесь к приведенному ниже сценарию, который решает ваши требования. Я использовал модуль pickle для сохранения файла, вы можете захотеть выгрузить его в текстовый файл и прочитать из него как отдельное упражнение. Кроме того, я не представил свою функцию с суффиксом , например.insert2, чтобы вы могли сравнить свои функции с моими и понять различия:

Еще одна вещь - в вашей программе была ошибка; Вы должны использовать 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() 
Смежные вопросы