44

Вопрос по python, append, file-io – Как добавить новые данные в новую строку

Мой код выглядит так:

def storescores():

   hs = open("hst.txt","a")
   hs.write(name)
   hs.close() 

поэтому, если я запустил его и ввел «Ryan», затем запустил его снова и ввел «Bob», файл hst.txt выглядит

RyanBob 

вместо

Ryan
Bob

Как это исправить?

7 ответов
13

Все ответы

кажется, работают нормально. Если вам нужно сделать этомного раззнай что пишешь

hs.write(name + "\n")

создает новую строку в памяти и добавляет ее в файл.

Более эффективным будет

hs.write(name)
hs.write("\n")

который не создает новую строку, просто добавляет в файл.

Это компромисс между созданием новой строки в памяти сBINARY_ADD против делатьLOAD_FAST чтобы получить hs (можно оптимизировать вне цикла),LOAD_ATTR получитьwriteиCALL_FUNCTION(относительно высокие накладные расходы) в два раза, так что это может зависеть от размераname строка. В конце концов, бенчмаркинг - лучший способ увидеть (и только если вам нужно это ускорение).

от Bryce Guinta
2

Ответ не заключается в добавлении новой строки после написания вашей с

троки. Это может решить другую проблему. То, что вы спрашиваете, это как добавить новую строкудо Вы начинаете добавлять свою строку. Если вы хотите добавить новую строку, но только если она еще не существует, вы должны выяснить это сначала, прочитав файл.

Например,

with open('hst.txt') as fobj:
    text = fobj.read()

name = 'Bob'

with open('hst.txt', 'a') as fobj:
    if not text.endswith('\n'):
        fobj.write('\n')
    fobj.write(name)

Возможно, вы захотите добавить новую строку после имени, или вы не можете, но в любом случае, это не ответ на ваш вопрос.

54

Если вы хотите новую строку

вы должны написать ее явно. Обычный способ таков:

hs.write(name + "\n")

Это использует обратную косую черту,\n, который Python преобразует в символ новой строки в строковых литералах. Это просто объединяет вашу строку,nameи этот символ новой строки в большую строку, которая записывается в файл.

Вместо этого также можно использовать многострочный строковый литерал, который выглядит следующим образом:

"""
"""

Или вы можете использовать форматирование строк вместо конкатенации:

hs.write("{}\n".format(name))

Все это объясняется вВход и выход глава в учебнике.

3

В Python&gt

= 3.6 вы можете использовать новыестроковый литерал особенность:

with open('hst.txt', 'a') as fd:
    fd.write(f'\n{name}')

Пожалуйста, обратите внимание, используяс уставом'автоматически закроет файл, когда он выйдет из области видимости

5

Я была такая же проблема. И я смог решить это с помощью форматера.file

Я была такая же проблема. И я смог решить это с помощью форматера.

file_name = "abc.txt"
new_string = "I am a new string."
opened_file = open(file_name, 'a')
opened_file.write("%r\n" %new_string)
opened_file.close()

Надеюсь, это поможет.

2

Я предполагаю, что все, что вам нужно, это простая конкатенация строк

def storescores():

   hs = open("hst.txt","a")
   hs.write(name + " ")
   hs.close() 

В качестве альтернативы, измените "" на "\ n" для новой строки.

@ user3320839: Обычно, когда я редактирую вопрос, я добавляю комментарий, объясняющий, что я сделал, но в этом случае я был почти уверен, что вы, вероятно, поймете это самостоятельно. И никакого вреда не сделано; никто не пишет идеальные вопросы с первой попытки.

от abarnert

Он хочет новую черту между ними, а не пробел. (Трудно сказать по вопросу, потому что его форматирование не работает, но если вы посмотрите на источник вопроса, он напечатал новую строку.)

от abarnert

Да, извините, я новичок в этом веб-сайте и не могу разобраться с форматированием вопросов, но я понял, спасибо

от RyanH2796

Спасибо - я обратился к этому на всякий случай, но я не проверял форматирование.

от Daniel Casserly
4

Есть также один факт

который вы должны учитывать. Вы должны сначала проверить, если ваш файл пуст, прежде чем добавлять что-либо к нему. Потому что, если ваш файл пуст, то я не думаю, что вы хотели бы добавить пустую новую строку в начале файла. Этот код

сначала проверяет, пуст ли файлЕсли файл пуст, тогда он просто добавит ваш входной текст в файл, иначе он добавит новую строку, а затем добавит ваш текст в файл.Вы должны использовать попытку поймать дляos.path.getsize() чтобы поймать любые исключения.

Код:

import os

def storescores():
hs = open("hst.txt","a")
if(os.path.getsize("hst.txt") > 0):
   hs.write("\n"+name)
else:
   hs.write(name)

hs.close()

Похожие вопросы