我正在尝试将字典导出到文本文件,如下面的代码所示:
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
如何修复此错误?我是否需要添加我缺少的其他属性?
感谢。
答案 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只使用字典的键。