从文本文件中删除多余的空间

时间:2016-01-22 23:25:40

标签: python whitespace

我目前正在将高分保存到名为“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"模式下打开文件(追加)?

4 个答案:

答案 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)