【问题标题】:Writing Dictionary to .csv将字典写入 .csv
【发布时间】:2017-03-29 12:23:18
【问题描述】:

环顾了大约一周后,我一直找不到可以开始工作的答案。我正在为我的第一年 CS 课程的一个项目担任任务经理。其他一切都按我的意愿工作(没有 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}

程序关闭后,我可以保留字典中存储的数据。但是,我无法得到任何我发现可以工作的东西。同样,这是一个初级 CS 课程,所以我不需要任何花哨的东西,只需要一些可以工作的基本知识。我在课堂上使用学校许可的 Canopy 形式。

【问题讨论】:

  • 字典的键和值是什么?只是字符串?
  • 是的,只是类和作业的基本字符串。

标签: python csv dictionary


【解决方案1】:

@Ébe Isaac 和@L3viathan 描述的泡菜方法是可行的方法。如果您还想对数据执行其他操作,您可能需要考虑使用 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 这么简单?
  • @ÉbeIsaac 只是作为替代方案。我也会采用你的泡菜方法(我现在也赞成),但如果他/她想对数据做其他事情,可能值得考虑。我应该在文本中更清楚地说明这一点,谢谢你的提问!
【解决方案2】:

要么使用csv library,要么做一些简单的事情,比如:

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。与上述评论一样,我可能只是缺少一些基本的东西。有什么建议吗?谢谢!
  • 我明白了,这意味着您的 values 是列表。在这种情况下,我会说 csv 可能是使用错误的格式。
  • 好吧,这就是我害怕的。感谢您的帮助!
  • 我误解了你,以为你在 Python 上使用了交互式 shell,这就是我现在的新解决方案所基于的。但是,如果您的计算机上安装了 Python,您应该能够使其正常工作(只需使用您有权访问的文件夹调用 os.chdir。)
  • 更改目录并使用您编辑的代码有效。谢谢!
【解决方案3】:

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 的唯一问题是我无法让它在目录中创建文件。每次我尝试泡菜时,我都会得到: [Errno 2] No such file or directory: 'assignments' 任何建议,还是我只是缺少一些基本的东西?谢谢!
  • @jdmonroe29 您是否像我发布的那样完全使用它?对我来说效果很好。
  • 是的,它仍然给出“没有这样的文件或目录”错误。我应该提到,因为课程,我正在使用学校许可的 Canopy 版本。我将编辑主要主题以提及这一点。这和它有什么关系吗?
  • @jdmonroe29:我想我可能会弄清楚你的问题。你是如何运行 Python 的:从终端/cmd-prompt、从服务器或从 IPython 实例/笔记本调用?
  • 我正在尝试从使用 python.org 中的基本 python 时打开的窗口运行它。就像我说的,我知道它可能非常基础,但这就是本课程所需的全部内容,虽然我可以下载其他内容,没问题。
猜你喜欢
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 2012-11-04
  • 2018-03-19
  • 2016-12-12
  • 2023-03-03
  • 2018-06-17
相关资源
最近更新 更多