Eliminar líneas de archivo en Python

Estoy tratando de crear un progtwig que tome un nombre de usuario y un puntaje alto, si ya son usuarios, actualizan a su nuevo puntaje alto o simplemente agregan el puntaje alto si no es así.

Mi código es:

try: a = open("data", "r+") except FileNotFoundError: a = open("data", "w") a = open("data", "r+") b = a.read() user = input("Username: ") user2 = list(user) if user in b: old = input("What is your old highscore? ") new = input("What is your new highscore? ") b2 = b.split() for line in b2: #Where I want to edit. line=line.replace(old, new) print(line) else: new = input("What is your highscore? ") a.write(user + " " + new + "\n") a.close() 

¿Alguien sabe cómo reemplazar lo viejo con lo nuevo en el archivo?

Le recomiendo que cambie a algún formato estándar para guardar información, como JSON, YAML, XML, CSV, pickle u otro. Entonces, lo que necesita es leer y analizar el archivo en la estructura de datos nativos (probablemente en el caso), modificarlo (es trivial) y volver a escribirlo.

Ejemplo con json (legible para humanos, muy fácil de usar):

 import json # loading data try: with open("data") as a: b = json.load(a) # b is dict except FileNotFoundError: b = {} # user name = input("What's your name? ") score = int(input("What's your high score? ")) # manipulating data b[name] = score # writing back with open("data", "w") as a: json.dump(b, a) 

Ejemplo con shelve (no legible por el usuario, pero extremadamente fácil de usar):

 import shelve name = input("What's your name? ") score = int(input("What's your high score? ")) with shelve.open("bin-data") as b: b[name] = score # b is dict-like 

La respuesta simple es: es imposible. Los sistemas operativos y sus operaciones de archivo no tienen noción de “líneas”. Se ocupan de bloques de datos binarios. Algunas bibliotecas como la biblioteca estándar de Python ponen una abstracción conveniente para leer líneas por encima de esto, pero no le permiten abordar líneas individuales.

Entonces, ¿cómo resolver el problema? Simplemente abriendo el archivo, leyendo todas las líneas, manipulando la línea en cuestión y luego vuelva a escribir todo el archivo.

  import tempfile highscore_file = tempfile.mktemp() with open(highscore_file, "w") as outf: outf.write("peter 1000\nsarah 500\n") player = "sarah" score = 2000 output_lines = [] with open(highscore_file) as inf: for line in inf: if player in line: # replace old with new line. Don't forget trailing newline! line = "%s %i\n" % (player, score) output_lines.append(line) with open(highscore_file, "w") as outf: outf.write("".join(output_lines)) with open(highscore_file) as inf: print inf.read() 

Primero apagado despues

 b = a.read() 

escribir

 a.close() a = open("data","w") 

Mira a donde te lleva eso.