Estoy tratando mi mano en el este rosalind problema y estoy ejecutando en un problema. Creo que todo en mi código es correcto, pero es evidente que no es como que no se está ejecutando según lo previsto. quiero borrar el contenido del archivo y, a continuación, escribir un texto para ese archivo. El programa escribe el texto que yo quiera, pero no eliminar primero el contenido inicial.

def ini5(file):
raw = open(file, "r+")
raw2 = (raw.read()).split("\n")
clean = raw2[1::2]
raw.truncate()
for line in clean:
    raw.write(line)
    print(line)

He visto:

Cómo eliminar el contenido de un archivo antes de escribir en él en una secuencia de comandos de python?

Pero mi problema persiste. ¿Qué estoy haciendo mal?

  • Como un aparte, esto no es una buena práctica, mejor crear un archivo temporal para la salida, y cambiarle el nombre por encima de su original al que se hace; de esa manera usted no destruir su archivo de entrada si el programa no se completa, y otros procesos en el sistema que ejecuta al mismo tiempo, siempre se puede acceder a una versión o la otra, ya sea el original o de forma actualizada.
InformationsquelleAutor Tare Gaskin | 2017-01-28

2 Comentarios

  1. 12

    truncate() trunca en la posición actual. Por su documentación, énfasis añadido:

    Cambiar el tamaño de la secuencia de determinado tamaño en bytes (o la posición actual si no se especifica ningún tamaño).

    Después de un read(), la posición actual es el final del archivo. Si desea truncar y volver a escribir con el mismo identificador de archivo, usted necesita para realizar un seek(0) para volver al principio.

    Así:

    raw = open(file, "r+")
    contents = raw.read().split("\n")
    raw.seek(0)                        # <- This is the missing piece
    raw.truncate()
    raw.write('New contents\n')

    (También se podría haber pasado raw.truncate(0), pero habría dejado el puntero-y por lo tanto la ubicación de las futuras escribe — en una posición que no sea el inicio del archivo, haciendo que su archivo disperso cuando empecé a escribir en esa posición).

  2. 5

    Si quieres completley sobrescribir los datos antiguos en el archivo, se debe usar otro mode para abrir el archivo.

    Debe ser:

    raw = open(file, "w") # or "wb"

    Para resolver su problema, en Primer lugar, leer el contenido del archivo:

    with open(file, "r") as f: # or "rb"
        file_data = f.read()
    # And then:
    raw = open(file, "w")

    Y, a continuación, ábralo con el write modo.De esta manera, usted no tendrá que anexar el texto en el archivo, usted acaba de escribir sólo sus datos.

    Leer acerca de los archivos de modo aquí.

    • El OP quiere realizar una lectura antes de sobrescribir; de lo contrario, sí, ellos han usado w, pero no es adecuado para ese propósito. Si estás proponiendo que se cierre la lectura de manejar y, a continuación, crear un segundo identificador de escritura, que es viable, pero podrías ser más explícito al respecto.
    • Tienes razón, lo he añadido.
    • upvote por la simplicidad. Me gustaría evitar la apertura de un asa para leer/escribir, si puedo evitarlo. Aunque sospecho que volver a utilizar el mismo identificador es más rápido.
    • Ok, así que he conseguido que funcione de la manera que yo quiera. Gracias a todos! Para aclarar aunque-Para extraer los contenidos (como la información de la cadena) que tengo que abrir el archivo en modo de lectura, sin embargo a editar el archivo que tengo que abrir en modo de escritura. Para hacer ambas cosas tengo que abrir el archivo en modo de lectura y, a continuación, el modo de escritura (no utilizar la «r+»)?
    • No exactamente, usted puede hacer uso de «r+». En su caso particular, se estaba bien al tanto. Sólo separados de ellos por la simplicidad.
    • ciertamente funciona … mi respuesta se describe cómo truncar y volver al principio del archivo antes de su escritura. Como tal, usted tiene dos opciones, con dos comportamientos diferentes, ¿cuál es más adecuado depende de su caso de uso. La apertura de un archivo independiente de la manija significa que potencialmente puede obtener diferentes inodo a escribir para que te lean, si la entrada de directorio se cambió de debajo de usted, así que estas son las dos soluciones diferentes, cada uno con su propia semántica.

Dejar respuesta

Please enter your comment!
Please enter your name here