Python: elimina las líneas de texto en blanco al final del archivo

Estoy escribiendo un script que modifica cualquier archivo de texto. Reemplaza las líneas de espacio en blanco con líneas en blanco. Borra las líneas en blanco al final del archivo. La imagen muestra la salida que quiero.

introduzca la descripción de la imagen aquí

Soy capaz de acercarme mucho a la salida deseada. El problema es que no puedo deshacerme de la última línea en blanco. Creo que esto tiene algo que ver con la última línea. por ejemplo, ' the lines below me should be gone realidad se ven así ' the lines below me should be gone\n' Parece que se han creado nuevas líneas en la línea anterior. por ejemplo, si la línea 4 tiene \n que la línea 5, en realidad será la línea en blanco, no la línea 4.

Debo tener en cuenta que no puedo usar rstrip o strip

Mi código hasta ahora.

 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') 

El \n significa esencialmente “crear otra línea”

Entonces, cuando hayas eliminado todas las líneas que son \n , todavía hay la línea anterior

 the lines below me should be gone\n 

Lo que nuevamente significa “crear otra línea”, más allá de las que ya eliminó

Ya que dices que no puedes usar rstrip , podrías terminar el ciclo con

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

para eliminar \n del último elemento. Debido a que \n no puede existir en ningún otro lugar en una línea, rstrip y strip tendrán el mismo efecto

O sin ninguna strip o endswith :

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

Tenga en cuenta que \n es un solo carácter, ordinal 0x0a como hexadecimal, no dos caracteres \ n , ordinales 0x5c y 0x6e . Es por eso que usamos -1 y no -2