2015-02-17 4 views
2

Я работаю над кодом, который по существу является супер-базовой системой AI (в основном простой версией Python для Cleverbot).Сохранение словаря Python во внешнем файле?

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

Так что я хочу, чтобы словарь был сохранен как внешний файл в одной и той же папке файла, так что программе не нужно «переучивать» данные каждый раз при запуске файла. Поэтому он загрузит его в начале запуска файла, и в конце он сохранит новый словарь во внешнем файле. Как я могу это сделать?

Должен ли я сделать это с помощью JSON, и если да, то как это сделать? Могу ли я это сделать, используя встроенный модуль json, или мне нужно загрузить JSON? Я попытался посмотреть, как его использовать, но не смог найти никаких хороших объяснений.

У меня есть основной файл, сохраненный в C: /Users/Alex/Dropbox/Coding/AI-Chat/AI-Chat.py

phraselist сохраняется в C:/Users/Alex/Dropbox/Coding /AI-Chat/phraselist.py

Я запускаю Python 2.7 через Canopy.

Когда я запускаю код, это выход:

In [1]: %run "C:\Users\Alex\Dropbox\Coding\AI-Chat.py" 
    File "C:\Users\Alex\Dropbox\Coding\phraselist.py", line 2 
    S'How are you?' 
    ^
SyntaxError: invalid syntax 

EDIT: Я получил его. Я должен был указать sys.path импортировать фразу Фром phraselist.py

Вот полный код у меня есть:

############################################ 
################ HELPER CODE ############### 
############################################ 
import sys 
import random 
import json 
sys.path = ['C:\\Users\\Alex\\Dropbox\\Coding\\AI-Chat'] #needed to specify path 
from phraselist import phrase 



def chooseResponse(prev,resp): 
    '''Chooses a response from previously learned responses in phrase[resp]  
    resp: str 
    returns str''' 
    if len(phrase[resp])==0: #if no known responses, randomly choose new phrase 
     key=random.choice(phrase.keys()) 
     keyPhrase=phrase[key] 
     while len(keyPhrase)==0: 
      key=random.choice(phrase.keys()) 
      keyPhrase=phrase[key] 
     else: 
      return random.choice(keyPhrase) 
    else: 
     return random.choice(phrase[resp]) 

def learnPhrase(prev, resp): 
    '''prev is previous computer phrase, resp is human response 
    learns that resp is good response to prev 
    learns that resp is a possible computer phrase, with no known responses 

    returns None 
    ''' 
    #learn resp is good response to prev 
    if prev not in phrase.keys(): 
     phrase[prev]=[] 
     phrase[prev].append(resp) 
    else: 
     phrase[prev].append(resp) #repeat entries to weight good responses 

    #learn resp is computer phrase 
    if resp not in phrase.keys(): 
     phrase[resp]=[] 

############################################ 
############## END HELPER CODE ############# 
############################################ 

def chat(): 
    '''runs a chat with Alan''' 
    keys = phrase.keys() 
    vals = phrase.values() 

    print("My name is Alan.") 
    print("I am an Artifical Intelligence Machine.") 
    print("As realistic as my responses may seem, you are talking to a machine.") 
    print("I learn from my conversations, so I get better every time.") 
    print("Please forgive any incorrect punctuation, spelling, and grammar.") 
    print("If you want to quit, please type 'QUIT' as your response.") 
    resp = raw_input("Hello! ") 

    prev = "Hello!" 

    while resp != "QUIT": 
     learnPhrase(prev,resp) 
     prev = chooseResponse(prev,resp) 
     resp = raw_input(prev+' ') 
    else: 
     with open('phraselist.py','w') as f: 
      f.write('phrase = '+json.dumps(phrase)) 
     print("Goodbye!") 

chat() 

И phraselist.py выглядит следующим образом:

phrase = { 
    'Hello!':['Hi!'], 
    'How are you?':['Not too bad.'], 
    'What is your name?':['Alex'], 
} 
+1

Почему бы не написать в другой файл Python, чтобы вы могли просто импортировать его в качестве словаря? –

ответ

4

Вы можете использовать pickle модуль для этого. Этот модуль имеет два метода,

  1. травильных (дамп): Преобразование Python объектов в строковое представление.
  2. Unpickling (load): Извлечение исходных объектов из сохраненного строкового представления.

https://docs.python.org/3.3/library/pickle.html код:

>>> import pickle 
>>> l = [1,2,3,4] 
>>> with open("test.txt", "wb") as fp: #Pickling 
... pickle.dump(l, fp) 
... 
>>> with open("test.txt", "rb") as fp: # Unpickling 
... b = pickle.load(fp) 
... 
>>> b 
[1, 2, 3, 4] 

Ниже приводится пример кода для нашей задачи:

  1. Определить имя файла фразы и использовать то же имя файла во время создания/обновления разговорники данных и также во время получения данных о фразе.
  2. Использование обработки исключений во время получения данных о фразе i.e. Проверить, присутствует ли файл на диске или нет на нем os.path.isfile(file_path).
  3. Как использовать dump и load методы рассола, чтобы установить и получить фразу.

код:

import os 
import pickle 
file_path = "/home/vivek/Desktop/stackoverflow/phrase.json" 

def setPhrase(): 
    phrase = { 
     'Hello!':['Hi!'], 
     'How are you?':['Not too bad.'], 
     'What is your name?':['Alex'], 
    } 
    with open(file_path, "wb") as fp: 
     pickle.dump(phrase, fp) 

    return 

def getPhrase(): 
    if os.path.isfile(file_path): 
     with open(file_path, "rb") as fp: 
      phrase = pickle.load(fp) 
    else: 
     phrase = {} 

    return phrase 

if __name__=="__main__": 
    setPhrase() 

    #- Get values. 
    phrase = getPhrase() 
    print "phrase:", phrase 

выход:

[email protected]:~/Desktop/stackoverflow$ python 22.py 
phrase: {'How are you?': ['Not too bad.'], 'What is your name?': ['Alex'], 'Hello!': ['Hi!']} 
0

Если она хранится в файле в том же каталоге, вы можете сделать:

phraselist.py

phrase = {'Hello!':['Hi!'],'How are you?':['Not too bad.'], 
     'What is your name?':['Alex'] 
    } 

и в вашем другом файле сделать:

from phraselist import phrase 

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

прямо перед выходом: Выход

with open('phraselist.py', 'w') as f: 
    f.write('phrase = '+ json.dumps(phrase)) 

переводчик:

Python 2.7.3 (default, Sep 26 2013, 20:08:41) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from phraselist import phrase 
>>> phrase 
{'How are you?': ['Not too bad.'], 'What is your name?': ['Alex'], 'Hello!': ['Hi!']} 
>>> phrase['Goodbye'] = ['See you later'] 
>>> phrase 
{'How are you?': ['Not too bad.'], 'What is your name?': ['Alex'], 'Goodbye': ['See you later'], 'Hello!': ['Hi!']} 
>>> import json 
>>> with open('phraselist.py', 'w') as f: 
... f.write('phrase = ' + json.dumps(phrase)) 
... 
>>> 
>>> exit() 
[email protected]:~$ python 
Python 2.7.3 (default, Sep 26 2013, 20:08:41) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from phraselist import phrase 
>>> phrase 
{'How are you?': ['Not too bad.'], 'What is your name?': ['Alex'], 'Goodbye': ['See you later'], 'Hello!': ['Hi!']} 
>>> 

ВАШ КОД:

phraselist.py:

phrase = {'Hello!':['Hi!'],'How are you?':['Not too bad.'],'What is your name?':['Alex']} 

выход из работы

[email protected]:~$ python AI-Chat.py 
My name is Alan. 
I am an Artifical Intelligence Machine. 
As realistic as my responses may seem, you are talking to a machine. 
I learn from my conversations, so I get better every time. 
Please forgive any incorrect punctuation, spelling, and grammar. 
If you want to quit, please type 'QUIT' as your response. 
Hello! hey 
Alex what's up? 
Not too bad. cool 
cool what do you do? 
Not too bad. ...okay 
what's up? not much, you? 
what do you do? I'm a software engineer, what about you? 
hey ...hey 
not much, you? i'm going to stop now 
Alex Goodbye! 
i'm going to stop now sigh... 
hey QUIT 
Goodbye! 

[email protected]:$vi phraselist.py 
phrase = {"...okay": [], "not much, you?": ["i'm going to stop now"], "Alex": ["what's up?", "Goodbye!"], "i'm going to stop now": ["sigh..."], "What is your name?": ["Alex"], "Not too bad.": ["cool",  "...okay"], "hey": ["...hey"], "...hey": [], "How are you?": ["Not too bad."], "sigh...": [], "what do you do?": ["I'm a software engineer, what about you?"], "what's up?": ["not much, you?"], "Goodb ye!": [], "Hello!": ["Hi!", "hey"], "I'm a software engineer, what about you?": [], "cool": ["what do you do?"]} 

одна модификация я сделал в AI-Chat.py:

while resp != "QUIT": 
    learnPhrase(prev,resp) 
    prev = chooseResponse(prev,resp) 
    resp = raw_input(prev+' ') 
else: 
    with open('phraselist.py','w') as f: 
     f.write('phrase = '+json.dumps(phrase)) 
    print("Goodbye!") 
+0

Это, кажется, не работает для меня. Я должен отметить, что я запускаю Python 2.7 через Canopy (потому что я занимаюсь классом программирования, и это то, что они используют - я только кодировал пару недель). Предложения? –

+0

какая ошибка вы видите? Я собираюсь отредактировать свой пост с помощью моего вывода от интерпретатора – deweyredman

+0

oops, у меня была синтаксическая ошибка .... извините – deweyredman

3

Вы можете сбросить его в JSON (встроенный в Python, так что вам не нужно устанавливать его)

import json 
json.dump(your_dictionary, open('file_name.json', 'wb')) 

Вы можете использовать рассол, но файл не будет читаемым человеком. Травление полезно, когда вам нужно хранить объекты python (или пользовательские).

+1

По сути, комбо вашего ответа и моей было бы выполнено ... – deweyredman

+0

На самом деле, hm его нужно было бы немного изменить. Для вашего ответа вам придется сбрасывать его и загружать каждый раз. Для моего вы должны загрузить модуль, а затем вывести 'фраза =' + json.dumps (фраза) в файл – deweyredman

+0

Я думаю, что мне нравится ваш путь немного лучше ... – deweyredman

0

Использование cPickles, он может хранить любую структуру питона в файл

import cPickles as p 
p.dump([Your Data], [Your File]) 

Независимо от того, что это список, набор, словарь или что-то еще.

Смежные вопросы