<p>首先,定义这些功能:</p>
<pre><code>from collections import defaultdict
def read_scores(users_class):
"""
If the score file for users_class does not exist, return an empty
defaultdict(list). If the score file does exist, read it in and return
it as a defaultdict(list). The keys of the dict are the user names,
and the values are lists of ints (the scores for each user)
"""
assert 0 <= users_class <= 3
result = defaultdict(list)
try:
lines =open("Class%d.txt"%users_class,'r').readlines()
except IOError:
return result
for line in lines:
# this line requires python3
user, *scores = line.strip().split(',')
# if you need to use python2, replace the above line
# with these two lines:
# line = line.strip().split(',')
# user, scores = line[0], line[1:]
result[user] = [int(s) for s in scores]
return result
def write_scores(users_class, all_scores):
"""
Write user scores to the appropriate file.
users_class is the class number, all scores is a dict kind of dict
returned by read_scores.
"""
f = open("Class%d.txt"%users_class,'w')
for user, scores in all_scores.items():
f.write("%s,%s\n"%(user, ','.join([str(s) for s in scores])))
def update_user_score(users_class, user_name, new_score):
"""
Update the appropriate score file for users_class.
Append new_score to user_name's existing scores. If the user has
no scores, a new record is created for them.
"""
scores = read_scores(users_class)
scores[user_name].append(new_score)
write_scores(users_class, scores)
</code></pre>
<p>现在,在代码的最后一部分(实际上是写分数的地方)变得简单多了。下面是一个写分数的例子:</p>
<pre><code>update_user_score(1, 'phil', 7)
update_user_score(1, 'phil', 6)
update_user_score(1, 'alice', 6)
update_user_score(1, 'phil', 9)
</code></pre>
<p>Class1.txt中将有两行:
菲尔,7,6,9
爱丽丝,6岁</p>
<p>我们将整个文件读入一个dict(实际上是一个defaultdict(list)),
通过使用defaultdict(list),我们不必担心更新和添加记录之间的区别。你知道吗</p>
<p>还要注意的是,我们不需要单独的if/elif案例来读/写文件。<code>"Scores%d.txt"%users_class</code>提供文件名。你知道吗</p>