【问题标题】:How in python to save and retrieve data to and from a csv file and into a dictionary?如何在 python 中将数据保存到 csv 文件和从字典中检索数据?
【发布时间】:2020-12-15 04:24:34
【问题描述】:

提前,这是我在这里的第一个问题,如果我的问题不清楚或过度,请原谅。我一般是编码新手,但我试图制作一个作为计算机部件目录的程序,只是为了练习编码。目前我已经设置好了,所以当我输入一个新项目时,它会经过一个类,并且该项目被赋予一个 ID #、名称、成本等......计算机部分被放入一个以 ID # 作为键的字典,并且值是类对象。我计划稍后能够按名称、成本等不同属性对不同部分进行排序......我正在尝试将字典保存到 csv 文件中,以便每次启动/结束程序时,我的计算机部件都来自上一次还存在。我试图通过在每次程序启动时将 csv 文件导入字典来实现这一点,这样我就可以查找或编辑任何以前的部分。然后,一旦我进行了任何更改,将使用更新的信息再次写入 csv 文件。因此,目前如果我在仅制作 1 部分后选择“7”选项,它将作为更新,并且应该将字典中的所有内容(仅一部分)发送到 csv 文件。

            elif choice == "7":
            with open('part_list.csv', 'w', ) as file:
                writer = csv.writer(file)
                for key, value in part_dict.items():
                    writer.writerow([key, value])

当我这样做时,csv 文件看起来像:

1,<__main__.Computer_Part object at 0x000001A723F6DFA0>

然后我希望能够退出程序,当我回来时我希望能够仍然拥有这部分,所以我会将信息从 csv 文件导入回原始字典(即现在自从我重新打开程序后空白)。我尝试使用以下代码来完成此操作:

def import_part_dict():
with open('part_list.csv', 'r') as file:
    reader = csv.reader(file)
    part_dict = {}
    for row in reader:
        key, value = row
        part_dict[key] = row
    return part_dict

但是,这样做会返回“ValueError: no enough values to unpack (expected 2, got 0)”。我不确定为什么这不会将 csv 文件值添加回字典。任何帮助将非常感激。这段代码是用 Python 3.9 编写的,如果这有什么改变的话。

【问题讨论】:

  • 看来您必须先将数据转换为字符串,然后才能保存为 CSV。 Python 不会自动为你做这件事。如果您有带有name, cost, 的对象,那么您可能需要.writerow([key, value.name, value,cost]) 而不是.writerow([key, value])
  • 也许可以使用print(row) 来查看您在阅读文件时会得到什么。它可以帮助您看到问题。您也可以在文本编辑器中打开 CSV 文件来查看您保存的内容。
  • 嘿 Furas,值是类对象这一事实会改变吗?例如,cvs 文件不显示“1, IntelCore, CPU, 25”。相反,它显示“1,class_object”,其中 1 是键(ID #),所以我相信名称、类型和价格等所有信息都保存在该 class_object 中。
  • 问题是你将它保存在类中,而 Python 没有方法将类转换为包含类中所有值的列表。你必须自己做——writerow([key, value.id, value.name, value,cost, ...]),当你从文件中读取它时也是如此。最好使用熊猫。或将其保存在数据库中(即 SQLite)。两者(熊猫,数据库)都有许多有用的功能来排序,过滤。通常你必须从头开始编写所有函数。
  • @furas 谢谢。我看到其他人推荐了熊猫,所以我正在看一下。使用 pandas 是否意味着我不需要使用该类?

标签: python csv dictionary


【解决方案1】:

在我看来,dict 对于这类事情会很麻烦。我强烈建议您利用 pandas 将 csv 数据带入数据框。使用数据框,您可以排序、添加/删除内容、运行查询、正则表达式等。

import pandas as pd

path_to_csv = '/my/path/to/csv/test.csv'
df = pd.read_csv(path_to_csv)

>>> df
  name     item  id
0  one  item001   1
1  two  item002   2

>>> df.iloc[0]
name        one
item    item001
id            1
Name: 0, dtype: object

https://www.learnpython.org/en/Pandas_Basics

【讨论】:

  • 我上的入门课没有涉及熊猫,所以我一定会看看。谢谢。
【解决方案2】:

items() 返回 dict_items 而不是 list。要将其转换为键和值对,只需 list(foo.items())。但是这个列表仍然是元组列表,像这样:

[(foo,1),(bar,2),(baz,3)]

它需要被展平成一个列表。有很多方法可以实现,但我使用itertools 显示一个示例。

import itertools

list(itertools.chain(*{'a':1,'b':2}.items()))

# ['a', 1, 'b', 2]

【讨论】:

  • 当您将items()for key, value 一起使用时,您会一个接一个地获得项目,而您不需要list()
  • 对不起,我说的不靠谱。
  • OP 没有 {'a':1,'b':2} ,它不需要被展平来保存它 - 它有 {'a':Computer_Part_Class,'b':Computer_Part_Class} 并且它需要从类 Computer_Part_Class 获取值以获取 Computer_Part_Class.id, Computer_Part_Class.name, Computer_Part_Class.cost 的方法
猜你喜欢
  • 2021-05-08
  • 1970-01-01
  • 2017-09-24
  • 1970-01-01
  • 2013-10-14
  • 2022-10-17
  • 1970-01-01
  • 2018-09-11
  • 2019-09-04
相关资源
最近更新 更多