Python - 删除文件末尾的空行

12

我正在编写一个脚本,用于修改任何文本文件。它将空白行替换为空行,并删除文件末尾的空行。下面的图片展示了我想要的输出结果。

enter image description here

我已经非常接近期望的输出结果了。问题在于我无法去掉最后一个空白行。我认为这与最后一行有关。例如,' the lines below me should be gone 实际上是这样的 ' the lines below me should be gone\n'。看起来新行被创建在前一行上。例如,如果第4行有\n,那么实际上第5行将是空行而不是第4行。

需要注意的是,我不能使用rstripstrip函数。

目前我的代码如下:

def clean_file(filename):
    # function to check if the line can be deleted
    def is_all_whitespace(line):
        for char in line:
            if char != ' ' and char != '\n':
                return False
        return True

    # generates the new lines
    with open(filename, 'r') as file:
        file_out = []
        for line in file:
            if is_all_whitespace(line):
                line = '\n'
            file_out.append(line)

    # removes whitespaces at the end of file
    while file_out[-1] == '\n':  # while the last item in lst is blank
        file_out.pop(-1)  # removes last element

    # writes the new the output to file
    with open(filename, 'w') as file:
        file.write(''.join(file_out))

clean_file('test.txt')

3
你对这个问题进行了大量的研究,表述非常清晰。加一。 - jayelm
1
为什么你"不能"使用.rstrip() - Karl Knechtel
@KarlKnechtel 那就太简单了。 - Vader
这是一份作业任务吗? - Bryan Oakley
1个回答

7
< p > \n实际上就是“创建另一行”的意思。< /p > < p >因此,当您删除所有包含\n的行时,仍然有前面的一行。< /p >
the lines below me should be gone\n

这再次意味着“创建另一行”,超出你已经删除的行。

由于您说不能使用 rstrip,您可以通过以下方式结束循环:

file_out[-1] = file_out[-1].strip('\n')

需要将最后一个元素中的\n移除。因为\n不能存在于行中的任何其他位置,所以rstripstrip具有相同的效果。

或者不使用任何stripendswith函数:

if file_out[-1][-1] == '\n':
    file_out[-1] = file_out[-1][:-1]

请注意,\n是一个单一的字符,十六进制为0x0a,而不是两个字符\n,它们的十六进制分别为0x5c0x6e。这就是为什么我们使用-1而不是-2的原因。

@Vader 那么我猜你可以使用 file_out[-1][-1] == '\n' - Santa
@Vader 你为什么想到使用“-2”?‘\n’只是一个字符。 - Santa
@Vader '\n' 是一个字符,表示“换行”。反斜杠 ('\') 是用来区分它与普通的 'n' 的转义符。 - Santa
@Vader 这样做是为了避免解析器将其误认为是普通的 'n'。当被转义时,你所看到的 '\n' 被解析器视为一个单一字符,即“换行符”,而不是斜杠和“n”。 - Santa
@Vader 对的。另一个例子是空字符。'\0'不是两个斜杠和零的字符,而是一个整数值为0的单个字节(也不是字符零)。 - Santa
返回翻译后的文本:这是很多注释,如果您已经完成了,请删除它们。 - mhlester

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接