我目前正在将高分保存到名为“score.txt”的文本文件中。 prgoram工作正常,正常情况下使用新的高分更新文件。除了每次程序更新文件时,在第一个高分之前总是有一个空行,当我下次尝试保存分数时会产生错误。代码:
scores_list = []
score = 10
def take_score():
# Save old scores into list
f = open("score.txt", "r")
lines = f.readlines()
for line in lines:
scores_list.append(line)
print scores_list
f.close()
take_score()
def save_score():
# Clear file
f = open("score.txt", "w")
print >> f, ""
f.close()
# Rewrite scores into text files
w = open("score.txt", "a")
for i in range(0, len(scores_list)):
new_string = scores_list[i].replace("\n", "")
scores_list[i] = int(new_string)
if score > scores_list[i]:
scores_list[i] = score
for p in range(0, len(scores_list)):
print >> w, str(scores_list[p])
print repr(str(scores_list[p]))
save_score()
提到的问题发生在save_score()
函数中。我尝试过这个相关的问题:Removing spaces and empty lines from a file Using Python,但它要求我以"r"
模式打开文件。有没有办法完成同样的事情,除非在"a"
模式下打开文件(追加)?
答案 0 :(得分:1)
您在创建文件后专门打印一个空行。
print >> f, ""
然后你追加它,保持空行。
如果您只是想在每次运行时清除内容,请删除它:
# Clear file
f = open("score.txt", "w")
print >> f, ""
f.close()
并修改此开头:
w = open("score.txt", "w")
'w'
模式已经截断,正如您已经使用的那样。没有必要截断,写一个空行,关闭,然后追加行。只需截断并写下你想要写的内容。
也就是说,您应该使用with
构造和文件方法来处理文件:
with open("score.txt", "w") as output: # here's the with construct
for i in xrange(len(scores_list)):
# int() can handle leading/trailing whitespace
scores_list[i] = int(scores_list[i])
if score > scores_list[i]:
scores_list[i] = score
for p in xrange(len(scores_list)):
output.write(str(scores_list[p]) + '\n') # writing to the file
print repr(str(scores_list[p]))
您将无需明确close()
文件句柄,因为with
会自动且更可靠地处理此问题。另请注意,您只需向range
发送一个参数,它将从0开始迭代,直到该参数为独占,因此我删除了冗余的起始参数0
。我还将range
更改为效率更高的xrange
,因为如果你想要与Python 3兼容并且你正在使用Python,那么range
在这里只会非常有用无论如何都是2式print
陈述,所以没有多大意义。
答案 1 :(得分:0)
print
为您打印的内容添加换行符。在行
print >> f, ""
您正在为该文件写一个换行符。当您以追加模式重新打开时,此换行符仍然存在。
正如@ Zizouz212所提到的,你不需要做这一切。只需在写入模式下打开,然后截断文件,然后写下您需要的内容。
答案 2 :(得分:0)
打开文件,清除文件,但不必再次打开同一文件。当您打开文件时,即使您不这么认为,也会打印换行符。这是违规行:
print >> f, ""
在Python 2中,它确实是这样做的。
print "" + "\n"
这是因为Python在每个print语句的字符串末尾添加了一个换行符。要停止此操作,您可以在语句末尾添加逗号:
print "",
或者直接写:
f.write("my data")
但是,如果您尝试保存Python数据类型,并且不必须是人类可读的,那么使用pickle可能会很幸运。使用起来非常简单:
def save_score():
with open('scores.txt', 'w') as f:
pickle.dump(score_data, f):
答案 3 :(得分:0)
这不是问题的真正答案。
这是我的代码版本(未经过测试)。并且不要避免重写所有内容;)
# --- functions ---
def take_score():
'''read values and convert to int'''
scores = []
with open("score.txt", "r") as f
for line in f:
value = int(line.strip())
scores.append(value)
return scores
def save_score(scores):
'''save values'''
with open("score.txt", "w") as f
for value in scores:
write(value)
write("\n")
def check_scores(scores, min_value):
results = []
for value in scores:
if value < min_value:
value = min_value
results.append(value)
return resulst
# --- main ---
score = 10
scores_list = take_score()
scores_list = check_scores(scores_list, score)
save_score(scores_list)