将字典导出为此格式的文本文件

时间:2015-02-21 13:50:13

标签: python file dictionary writetofile


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

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']}

但最后一次写入文本文件并不起作用。我想写入同一个文件,但这会返回错误:

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

如何修复此错误?我是否需要添加我缺少的其他属性?

感谢。

3 个答案:

答案 0 :(得分:1)

您需要使用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这样打开文件,这将附加所有写作到最后(如果你先通过它)。我建议打开一个新的&#34;输出&#34;文件,以便您不会写任何数据。

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

答案 1 :(得分:1)

您的代码存在一些问题。

你得到的错误是因为:

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
将分数更改为30并再次运行后

Class 1.txt

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

答案 2 :(得分:0)

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

for user, score in user_scores.items():

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