将字典写入 .csv 文件

3

在寻找了一周后,我无法找到一个可行的解决方案。 我正在为我的第一年计算机科学课程项目制作一种任务管理器。 除了无GUI(仅文本),其他所有功能都按照我的想法运行,但是每次重新打开它时,无法保存数据以供使用。 基本上,我想保存我的类字典:

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}

在程序关闭后,我希望能够保留存储在字典中的数据。但是,我无法让我找到的任何东西起作用。再次强调,这是一个初学者计算机科学课程,所以我不需要任何高级的功能,只需要一些基本的能够工作的东西。我正在使用学校授权的Canopy表格来完成课程目标。

字典的键和值是什么?只有字符串吗? - Cleb
是的,只是基本的字符串用于类和赋值。 - jdmonroe29
3个回答

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"))

通过这种方法,变量将保留其原始结构,无需手动编写和转换为不同格式。

我使用pickle遇到的唯一问题是无法在目录中创建文件。每次尝试使用pickle时,都会出现以下错误:[Errno 2] No such file or directory: 'assignments'。请问有什么建议吗?还是我忽略了某些基本的东西?谢谢! - jdmonroe29
是的,它仍然会出现“没有这个文件或目录”的错误。我应该提到,由于课程的原因,我正在使用学校授权版本的Canopy。我将编辑主题以提及此事。这可能与此有关吗? - jdmonroe29
@jdmonroe29:我想我可能会找出你的问题所在。你是如何运行Python的:从终端/cmd提示符调用,从服务器调用,还是从IPython实例/笔记本调用? - Ébe Isaac
我正在尝试从python.org的基本Python中打开的窗口运行它。就像我说的,我知道这可能非常基础,但这是我在这门课程中所需要的全部,虽然我可以下载其他东西,没有问题。 - jdmonroe29
如果你想要保存文件,就必须安装真正的Python程序,因为在python.org的交互式shell中无法读取或写入文件。或者你可以打印一些字符串表示来代替。 - L3viathan
显示剩余8条评论

3
要么使用csv库,要么像下面这样简单处理:
with open("assignments.csv", "w") as f:
    for key, value in classes.items():
        f.write(key + "," + value + "\n")

编辑:由于您似乎无法在系统中读取或写入文件,这里提供一种替代方案(使用pickle和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]}

这会出现一个问题:TypeError: cannot concatenate 'str' and 'list' objects。就像上面的评论一样,我可能只是缺少一些基础知识。有什么建议吗?谢谢! - jdmonroe29
我明白了,这意味着你的“value”是列表。在这种情况下,我认为CSV可能不是正确的格式。 - L3viathan
好的,这正是我担心的。感谢您的帮助! - jdmonroe29
我误解了你的意思,以为你在使用Python的交互式shell,这是我现在新解决方案的基础。但是,如果你已经在电脑上安装了Python,你应该能够让它工作(只需使用一个你有权限的文件夹调用os.chdir即可)。 - L3viathan
1
更改目录并使用您编辑过的代码是有效的。谢谢! - jdmonroe29
不错!这确实涵盖了所有类型的数据。 - Cleb

1
@Ébe Isaac和@L3viathan描述的pickle方法是正确的选择。如果您还想对数据进行其他操作,可以考虑使用pandas(仅在除导出数据之外的情况下使用)。
根据您在问题下面的评论,您的字典中只有基本字符串,因此使用起来很简单;如果您有更复杂的数据结构,则应使用pickle方法。
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') 使用字典作为输入创建实际的数据框

.sort_index() 对索引进行排序,因为您使用字典创建数据框时索引没有排序

.rename(columns={0: 'assignments'}) 仅将更合理的名称分配给列(默认情况下使用'0')

.to_csv('my_csv.csv') 最终将数据框导出到csv文件

如果您想再次读取文件,则可以按以下方式执行:

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

为什么要在这么简单的情况下使用 pandas - Ébe Isaac
@ÉbeIsaac 只是提供一个备选方案。我也会选择你的pickle方法(我现在也点赞了),但如果他/她想对数据做其他事情,考虑一下也许是值得的。我应该在文本中更清楚地表达这一点,感谢你的问题! - Cleb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接