以这种格式将字典导出到文本文件

Exporting a dictionary to a text file in this format


我正在尝试将字典导出到文本文件,如下面的代码所示:

user_scores = {}

with open('Class 1.txt') as f:
    for line in f:
        this_line = line.strip().replace("\n","").split(",")
        user_scores[this_line[0]] = this_line[1:]

    username = "Andy.Singh"
    score = 25

    user_scores[username] = score

    print(user_scores)

    for user,score in user_scores:
        f.write(user + ',' + score)

目前 Class 1.txt 的文本文件已显示:

Bob.Smith, 10, 20, 30

这里,字典 user_scores 中写入了 Bob.Smith 的用户名和分数。我也在写另一个新名字,Andy.Singh,他获得了 25.

的分数

当我运行代码时,字典正确写入字典如下所示:

{'Andy.Singh': 25, 'Bob.Smith': [' 10', ' 20', ' 30']}

但是最后写入文本文件不起作用。我想写入同一个文件,但是 returns 错误:

Traceback (most recent call last):
  File "/Users/Ahmad/Downloads/Manraj/test.py", line 15, in <module>
     for user,score in user_scores:
ValueError: too many values to unpack (expected 2) 

简单来说,我希望文件现在显示:

Bob.Smith, 10, 20, 30
Andy.Singh, 25

我该如何解决这个错误?我是否需要添加我缺少的其他属性?

谢谢。

用于在for循环中获取字典的键和值:

for user, score in user_scores.items():

如果在 for 循环中只使用 user_scores,python 只使用字典的键。

您需要使用 user_scores.items()user_score.iteritems()。您还需要迭代分数列表,然后添加 '\n' 转到下一行:

for user,score in user_scores.iteritems():
    f.write(user + ' , ')
    for i in list(score): f.write(str(i) + ' , ')
    f.write('\n')

此外,我刚刚意识到您正在写入您正在读取的同一个文件,您需要像这样打开文件 with open('openfile.txt', 'r+') as f,这会将所有写入附加到末尾(如果你先循环它)。我建议打开一个新的 "output" 文件,这样您就不会覆盖任何数据。

如果您想完全覆盖文件,请使用 'w''wb' 再次打开文件。

您的代码有几处错误。

您收到的错误是因为:

for user,score in user_scores:

不会像您想象的那样遍历字典的内容。要正确地做到这一点,你需要使用类似的东西:

for user, scores in user_scores.items():

其他问题与文件处理有关。默认情况下,open() 只打开一个文件只供阅读。要做到这两点,你需要类似 'r+' 的模式,这意味着阅读和写作。

同样,在将行写入文件的循环中,需要处理存在分数列表和只有一个分数列表的情况。为了简化事情,我让添加/更新条目总是创建一个值列表,即使该列表只包含一个值。这使得只需要以一种方式处理分数成为可能——因为它们总是列表——在用于更新文件的 write() 语句中完成的格式化中。

user_scores = {}

with open('Class 1.txt', 'r+') as f:
    # read existing contents
    for line in f:
        this_line = [elem.strip() for elem in line.split(",")]
        user_scores[this_line[0]] = this_line[1:]

    # add or update an entry
    username = "Andy.Singh"
    score = 25
    user_scores.setdefault(username, []).append(str(score))

    print(user_scores)

    # rewrite file
    f.seek(0)  # rewind file
    for user, scores in user_scores.items():
        f.write('{}, {}\n'.format(user, ', '.join(s for s in scores)))

Class 1.txt 在 运行 之后:

Bob.Smith, 10, 20, 30
Andy.Singh, 25

Class 1.txt 将分数添加到 30 并再次 运行 后:

Bob.Smith, 10, 20, 30
Andy.Singh, 25, 30