2016-12-13 1 views
1

Я пытаюсь написать словарь (и читать) файл, где ключ представляет собой комбинацию из кортежа и Int, как показано ниже:Дать кортеж и ИНТ ключей словаря в файл

Q = {((True, False, 1, 0), 1): 100} 

Я пробовал pickle, json и csv, но, похоже, не мог решить сложную ключевую проблему, и я не могу найти много документации по этому типу словаря.

#json code which works for a tuple only as the key 

def write_file(mat): 
    with open('file.json', 'w') as f: 
     json.dump(mat, f) 

def read_file(): 
    with open('file.json', 'r') as f: 
     try: 
      data = json.load(f) 
     except ValueError: 
      data = {} 
    return data 
+2

Можете ли вы отправить stacktrace (вместо того, чтобы улавливать ошибку?) –

+0

'pickle' должен быть в состоянии сделать это легко. Какая конкретная проблема у вас была с этим - или у вас есть предпочтение одному из других? – martineau

+0

@ Jean-François Fabre: Это не так далеко - необработанное исключение происходит в 'write_file()': 'TypeError: key ((True, False, 1, 0), 1) не является строкой' – martineau

ответ

0

Рассол отлично работает для меня: выход

Q = {((True, False, 1, 0), 1): 100} 

import pickle 

with open("test", "wb") as file: 
    pickle.dump(Q, file) 
with open("test", "rb") as file: 
    QQ=pickle.load(file) 
print(QQ) 

будет:

{((True, False, 1, 0), 1): 100}

Это на питона 2,7

Не могли бы вы опубликовать свой код маринад для сравнения, в том числе сообщение об ошибке ?

+1

I «Не уверен, что« это работает »- это правильный способ ответа. Если бы это сработало для ОП, то он/она не разместил бы здесь. –

+0

Если бы ОП опубликовал свой код марихуаны, я бы исправил его. Независимо от того, я действительно думаю, что это хороший ответ, OP хочет сохранить этот словарь, возможно, используя pickle. Мой ответ показывает способ сделать это. Даже если бы OP разместил код, в конце концов, вероятно, это привело бы к чему-то подобному. – lhk

+0

Эй, я не опубликовал код рассола, учитывая единственное отличие от JSON: pickle.dump вместо json.dump , и я подумал, что это просто заняло много места в вопросе, но мое плохое. . Так что мой код был identiccal для вас, кроме как с попыткой в ​​файле чтения и да я использую python 2.7 извините, должен был включить это в вопрос – Catherine

0

Это может потенциально решить вашу проблему. Я в основном конвертирую кортеж, который у вас есть в строку, создавая новый словарь. Я храню это в файле json, а затем использую встроенную функцию eval, чтобы вернуть кортеж. Хотя это работает, будьте осторожны с функцией eval, если вы не знаете, откуда ваши данные.

Q = {((True, False, 1, 0), 1): 100} 
Q_new = dict([(str(i),j) for i,j in Q.items()]) 

def write_file(mat): 
    with open('file.json', 'w') as f: 
     json.dump(mat, f) 

def read_file(): 
    with open('file.json', 'r') as f: 
     data = json.load(f) 
     return dict([(eval(str(i)),j) for i,j in Q.items()]) 

write_file(Q_new) 
print(read_file()) 

Выход:

{((True, False, 1, 0), 1): 100} 
0

Как я уже говорил, pickle можно легко сохранять и восстанавливать содержимое словаря сложных ключей в файл (и читать его обратно).

Если вы действительно хотите использовать формат JSON, чтобы сделать это, вы можете использовать от этого факта, и хранить pickle d данных в качестве значения специального ключа в «нормальном» Python dict:

import json 
import pickle 

def my_dump(obj, *args, **kwargs): 
    if isinstance(obj, dict): 
     pkl = {'_python_object': pickle.dumps(obj)} 
     return _orig_dump(pkl, *args, **kwargs) 
    return _orig_dump(obj, *args, **kwargs) 

# monkey-patch json module to use our dump function (optional) 
_orig_dump = json.dump 
json.dump = my_dump 

def as_python_object(dct): 
    if '_python_object' in dct: 
     return pickle.loads(str(dct['_python_object'])) 
    return dct 

def write_file(mat): 
    with open('file.json', 'w') as f: 
     json.dump(mat, f) 

def read_file(): 
    with open('file.json', 'r') as f: 
     data = json.load(f, object_hook=as_python_object) 
    return data 

Q = {((True, False, 1, 0), 1): 100} 
write_file(Q) 
d = read_file() 
print(d) # -> {((True, False, 1, 0), 1): 100} 
Смежные вопросы