【问题标题】:Reading from a dictionary in a csv file从 csv 文件中的字典读取
【发布时间】:2015-02-26 21:29:30
【问题描述】:

我正在尝试创建一段代码,它会询问您的姓名和分数,然后将您最近的分数保存到 csv 文件中。我设法让它检查您是否在字典中,并将您的 3 个最新分数存储在 csv 文件中。但是,我不知道如何获取代码来打开它保存的文件,这意味着每次保存字典后,它都会保存您最新的存储并删除其他所有内容。

这是我得到的:

import csv

nam=input("Name")
sco=int(input("Score"))


if nam in class1:
    namsco=class1[nam]
    del class1[nam]
    del namsco[0]
    namsco.append(sco)
    class1[nam]=namsco
    print("Score added")
else:
    print ("Creating profile")
    class1[nam]=[0,0,sco]
    print("Score added")


with open('temp.csv', 'w') as f:
    w = csv.DictWriter(f, class1.keys())
    w.writeheader()
    w.writerow(class1)

我省略了class1={},因为在导入字典时需要添加它。

【问题讨论】:

  • 严肃的问题:为什么nam而不是name,为什么sco而不是score?此外,如果您尝试序列化(“保存”)dict 对象,为什么要使用csv?这是互操作性的问题吗?如果不是,为什么不腌制呢?
  • append 模式而不是write 模式打开文件?

标签: python csv python-3.x dictionary


【解决方案1】:

以下尝试使用 csv 文件中的数据初始化 class1 字典。如果因为是第一次而失败并且文件不存在,则将其设置为空字典。

接下来,它会通过添加新条目或更新现有条目来更新此字典,最后使用更新后字典中的值重写整个文件。

注意,当使用csv.DictReadercsv.DictWriter 时,每一行也是一个字典。在这种情况下,使用 csv.readercsv.writer 可能会更容易,其中每一行只是一个值序列。

import csv

name = input('Name: ')
score = int(input('Score: '))

try:
    with open('class1.csv', 'r', newline='') as inf:
        class1 = {row['name']: [row['score0'], row['score1'], row['score2']]
                    for row in csv.DictReader(inf)}
except FileNotFoundError:
    class1 = {}

print('Updating' if name in class1 else 'Creating', name+"'s", 'profile')
del class1.setdefault(name, [0, 0, 0])[0]
class1[name].append(score)
print('Score added')

with open('class1.csv', 'w', newline='') as outf:
    FIELD_NAMES = ['name', 'score0', 'score1', 'score2']
    writer = csv.DictWriter(outf, FIELD_NAMES)
    writer.writeheader()
    writer.writerows(dict(zip(FIELD_NAMES, [name] + scores))
                        for name, scores in class1.items())
print('File written')

【讨论】:

    【解决方案2】:

    您正在寻找“a”参数(附加到文件),而不是“w”。

    如果这不能回答问题,我将删除它。我不明白反对票。

    【讨论】:

    • 几乎,我希望能够打开文件,这样我就可以更改最旧的值,而不仅仅是再次将它们添加到文件中。例如,我想打开 Sue 的分数,将它从 4,1,5 更改为 1,5,7。没有用 0,0,7 创建另一个 Sue。
    • 打开文件,读取数据,更改值,写入新文件。您最初的问题非常具有误导性。似乎您想不断地将数据附加到此文件中。您实际上想要做的实际上是使用更改的值创建一个新文件。您可以覆盖原始文件,但无法编辑 csv 文件。
    猜你喜欢
    • 2021-08-20
    • 2023-01-08
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    相关资源
    最近更新 更多