2016-11-15 6 views
3

Оглядываясь примерно на неделю, я не смог найти ответ, который я могу приступить к работе. Я создаю менеджера заданий для проекта для моего первого класса CS. Все остальное работает так, как мне бы хотелось (без GUI, только текст), за исключением того, что я не могу сохранять данные для использования при каждом его повторном открытии. В принципе, я хотел бы сохранить мой словарь классов:Написание словаря для .csv

classes = {period_1:assignment_1, period_2:assignment_2, period_3:assignment_3, period_4:assignment_4, period_5:assignment_5, period_6:assignment_6, period_7:assignment_7} 

после того, как программа закрывается так, что я могу сохранить данные, хранящиеся в словаре. Однако я не могу получить то, что нашел на работе. Опять же, это начальный класс CS, поэтому мне не нужно ничего интересного, просто что-то основное, что будет работать. Я использую лицензированную для школы форму Canopy для целей класса.

+0

Каковы ключи и значения словаря? Просто строки? – Cleb

+0

Да, только основные строки для обоих классов и заданий. – jdmonroe29

ответ

3

Либо использовать csv library, или сделать что-то простое, как:

with open("assignments.csv", "w") as f: 
    for key, value in classes.items(): 
     f.write(key + "," + value + "\n") 

Edit: Так как кажется, что вы не можете читать или записывать файлы в вашей системе, вот альтернативное решение (с маринадом и base85):

import pickle, base64 

def save(something): 
    pklobj = pickle.dumps(something) 
    print(base64.b85encode(pklobj).decode('utf-8')) 

def load(): 
    pklobj = base64.b85decode(input("> ").encode('utf-8')) 
    return pickle.loads(pklobj) 

чтобы сохранить что-то, вы называете save на вашем объекте, а затем скопировать строку, которая печатается в буфер обмена, а затем вы можете сохранить его в файл, например.

>>> save(classes) # in my case: {34: ['foo#', 3]} 
fCGJT081iWaRDe;1ONa4W^ZpJaRN&NWpge 

Для загрузки, вы звоните load() и введите строку:

>>> load() 
> fCGJT081iWaRDe;1ONa4W^ZpJaRN&NWpge 
{34: ['foo#', 3]} 
+0

Выдает вопрос: TypeError: не может конкатенировать объекты 'str' и 'list'. Как и в вышеупомянутом комментарии, я, вероятно, просто пропустил что-то основное. Любой совет? И спасибо! – jdmonroe29

+0

Я вижу, это означает, что ваши 'значения' являются списками. В этом случае я бы сказал, что csv, вероятно, является неправильным форматом. – L3viathan

+0

Хорошо, вот чего я боялся. Спасибо вам за помощь! – jdmonroe29

4

пост L3viathan может быть в прямой ответ на этот вопрос, но я хотел бы предложить следующее для вашей цели: с помощью pickle.

import pickle 

# To save a dictionary to a pickle file: 
pickle.dump(classes, open("assignments.p", "wb")) 

# To load from a pickle file: 
classes = pickle.load(open("assignments.p", "rb")) 

С помощью этого метода переменная сохранит свою первоначальную структуру без необходимости записи и преобразования в разные форматы вручную.

+0

Единственная проблема, с которой я столкнулся с рассолом, заключается в том, что я не могу заставить его создать файл в каталоге. Каждый раз, когда я пробовал pickle, я получаю: [Errno 2] Нет такого файла или каталога: «Назначения». Любой совет, или я просто пропустил что-то основное? И благодарю вас! – jdmonroe29

+0

@ jdmonroe29 Ты использовал его * точно, как я писал? Это отлично работает для меня. –

+0

Да, он по-прежнему выдает ошибку «Нет такого файла или каталога». Я должен был упомянуть, я пользуюсь лицензией на школьную версию Canopy из-за класса. Я отредактирую основную тему, чтобы упомянуть об этом. Может ли это иметь к этому какое-нибудь отношение? – jdmonroe29

1

Метод рассола, описанный @ Ébe Isaac и @ L3viathan, - это путь. В случае, если вы также хотите сделать что-то еще с данными, вы можете рассмотреть панды (которые вы должны использовать только в том случае, если вы делаете что-то другое, кроме как просто экспортируете данные).

Поскольку в вашем словаре есть только основные строки в соответствии с вашим комментарием под вашим вопросом, это просто использовать; если у вас есть более сложные структуры данных, то вы должны использовать рассол подход:

import pandas as pd 

classes = {'period_1':'assignment_1', 'period_2':'assignment_2', 'period_3':'assignment_3', 'period_4':'assignment_4', 'period_5':'assignment_5', 'period_6':'assignment_6', 'period_7':'assignment_7'} 

pd.DataFrame.from_dict(classes, orient='index').sort_index().rename(columns={0: 'assignments'}).to_csv('my_csv.csv') 

Это дает следующий результат:

  assignments 
period_1 assignment_1 
period_2 assignment_2 
period_3 assignment_3 
period_4 assignment_4 
period_5 assignment_5 
period_6 assignment_6 
period_7 assignment_7 

Подробно:

.from_dict(classes, orient='index') создает реальную dataframe с помощью словарь, как на входе

.sort_index() сортирует индекс, который не сортируется по мере использования словаря fo г создание dataframe

.rename(columns={0: 'assignments'}) что просто присваивает более разумное имя для столбца (по умолчанию «0» используется)

.to_csv('my_csv.csv'), что в конце концов экспортирует dataframe в CSV

Если вы хотите для повторного чтения в файле вы можете сделать это следующим образом:

df2 = pd.read_csv('my_csv.csv', index_col=0) 
+0

Почему «панда» для чего-то такого простого? –

+0

@ ÉbeIsaac Как альтернатива. Я бы тоже пошел с вашим маринованным подходом (который я теперь также поддержал), но в случае, если он/она хочет сделать что-то еще с данными, возможно, стоит его рассмотреть. Я должен сделать это более ясным в тексте, спасибо за вопрос! – Cleb

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