cómo agregar una nueva línea en un archivo de texto usando python sin \ n

Tengo un archivo que tiene una lista de archivos, pero agrega \n al final, ¿cómo puedo hacer que Python escriba la información que necesito en una nueva línea sin tener que \n en la forma en que mi información se llamará X.acc no x.acc\n ? Aquí está mi código que escribe el archivo

 def add(x): nl = "\n" acc = ".acc" xy = x + acc exyz = xy xyz = exyz xxx = str(xyz) tf = open('accounts.dat',"a+") tf.writelines(nl) tf.writelines(xxx) tf.close 

Aquí está el código que llama al archivo:

 import sys tf = open('accounts.dat','r') names = tf.readlines() u = choicebox(msg="pick something",title = "Choose an account",choices=(names)) counter_file = open(u, 'r+') content_lines = [] for line in counter_file: if line == "credits =": creds = line else: False for line in counter_file: if 'credits =' in line: line_components = line.split('=') int_value = int(line_components[1]) + 1 line_components[1] = str(int_value) updated_line= "=".join(line_components) content_lines.append(updated_line) else: msgbox(msg=(creds)) content_lines.append(line) counter_file.seek(0) counter_file.truncate() counter_file.writelines(content_lines) counter_file.close() 

gracias por su ayuda y disculpe si esta es una pregunta trival aún nueva para Python 🙂

Su pregunta realmente no tiene sentido, debido a lo que realmente es una “línea” y lo que significa el carácter '\n' .

Los archivos no tienen un concepto intrínseco de líneas. Un archivo es solo una secuencia de bytes. '\n' es el separador de línea (como Python lo representa con líneas nuevas universales). Si desea que sus datos aparezcan en diferentes “líneas”, debe colocar un separador de línea entre ellos. Eso es todo lo que es el carácter '\n' . Si abre el archivo en un editor de texto después de escribirlo, la mayoría de los editores no mostrarán explícitamente el carácter de nueva línea de forma predeterminada, porque ya está representado por la separación de las líneas.


Para desglosar lo que está haciendo su código , veamos el método de add y arregle algunas cosas a lo largo del camino.

Lo primero que hace add es nombrar una variable llamada nl y asignarle el carácter de nueva línea. A partir de esto, puedo suponer que nl significa “nueva línea”, pero sería mucho mejor si ese fuera realmente el nombre de la variable.

A continuación, '.acc' una variable llamada acc y le asignamos el sufijo '.acc' , probablemente para ser usado como una extensión de archivo o algo así.

A continuación, creamos una variable llamada xy y la asignamos a x + acc . xy ahora es una cadena, aunque no tengo idea de qué contiene el nombre de la variable. Con un cierto conocimiento de lo que se supone que x es o lo que representan estas líneas, quizás podría cambiar el nombre de xy a algo más significativo.

Las siguientes tres líneas crean tres nuevas variables llamadas exyz , xyz y xxx , y las apuntan todas a la misma cadena que xy referencia. No hay ninguna razón para ninguna de estas líneas en absoluto, ya que sus valores no se usan de manera significativa.

Ahora, abrimos un archivo. Multa. Tal vez tf significa “el archivo”? “Archivo de texto”? Una vez más, el cambio de nombre haría que el código sea mucho más amigable.

Ahora, llamamos a tf.writelines(nl) . Esto escribe el carácter de nueva línea ( '\n' ) en el archivo. Dado que el método de writelines de escritura está diseñado para escribir una lista completa de cadenas, no solo un solo carácter, será más limpio si cambiamos esta llamada a tf.write(nl) . También cambiaría esto para escribir la nueva línea al final, en lugar del principio, por lo que la primera vez que escribe en el archivo no inserta una línea vacía en la parte frontal.

A continuación, llamamos a writelines nuevo, con nuestra variable de datos ( xxx , pero espero que esto haya cambiado de nombre). Lo que realmente hace es dividir el xxx iterable (una cadena) en sus caracteres componentes, y luego escribir cada uno de ellos en el archivo. Mejor reemplazarlo con tf.write(xxx) también.

Finalmente, tenemos tf.close , que es una referencia a la función de close del objeto de archivo. Es un no-op, porque lo que supuestamente quisiste decir era cerrar el archivo, llamando al método: tf.close() . También podríamos envolver el archivo como un administrador de contexto , para hacer su uso un poco más limpio. Además, la mayoría de las variables no son necesarias: podemos usar el formato de cadena para hacer la mayor parte del trabajo en un solo paso. En definitiva, su método podría verse así al final del día:

 def add(x): with open('accounts.dat',"a+") as output_file: output_file.write('{0}.acc\n'.format(x)) 

Como puede ver, la razón por la que aparece '\n' al final de cada línea es porque la está escribiendo entre cada línea. Además, esto es exactamente lo que tienes que hacer si quieres que las líneas aparezcan como “líneas” en un editor de texto. Sin el carácter de nueva línea, todo aparecería todo destrozado (saque el '\n' en mi método de add arriba y compruébelo usted mismo).


El problema que describió en el comentario está ocurriendo porque los names son una lectura directa del archivo. Mirando la documentación de readlines , devuelve una lista de las líneas en el archivo, rompiendo en cada nueva línea. Entonces, para limpiar esos nombres, desea que la línea 4 del código que publicó para llamar a str.strip en las líneas individuales. Puedes hacerlo así:

 names = tf.readlines() for i in range(len(names)): names[i] = names[i].strip() # remove all the outside whitespace, including \n 

Sin embargo, es mucho más limpio, más rápido y, en general, más agradable para aprovechar las comprensiones de la lista de Python, y el hecho de que los objetos de archivos ya son iterables línea por línea. Así que la siguiente expresión es equivalente a la anterior, pero se ve mucho mejor:

 names = [line.strip() for line in tf] 

Solo cambia agrega:

 def add(x): nl = "\n" acc = ".acc" xy = x + acc exyz = xy xyz = exyz xxx = str(xyz) tf = open('accounts.dat',"a+") tf.writelines(xxx) tf.writelines(nl) # Write the newline AFTER instead of before the output tf.close() # close is a function so needs to be called by having () at the end. 

Vea los comentarios de lo que ha cambiado.

¿por qué no solo escribe una función con “\ n” al final de la línea? Así que no hay necesidad de recordar “\ n” cada vez

Hice esta manera-

 import os log_path = r"c:\python27\Logs\log.txt" if not os.path.exists(r"c:\python27\Logs"): os.mkdir(r"c:\python27\Logs") def write_me_log(text): global log_path with open(log_path,"a+") as log: log.write(text+"\n") write_me_log("Hello this is the first log text with new line") 
  file = open("accountfile.txt","a") file.write(username) file.write(" ") file.write(password) file.write(" ") file.write(age) #need it to go down a line here so it writes"hello world" on the next line file.write("hello world") file.close()``