Как в Python добавить текст в файл

Когда вы открываете файл в режиме “для записи” (параметр 'w' функции open()), при последующем сохранении данных в этот файл старые данные, уже сохраненные в нем, заменяются новыми. Но такое поведение требуется не всегда. В этой статье мы рассмотрим, как при помощи Python добавить текст в существующий файл.

Скачивайте книги ТОЛЬКО на русском языке у нас в телеграм канале: PythonBooksRU

Чтобы добавить текст в файл, сначала нужно открыть этот файл с режимом доступа 'a' (от англ. append – “добавлять, присоединять”):

file_object = open('sample.txt', 'a')

При режиме доступа к файлам 'a' функция open() сначала проверяет, существует ли файл. Если файл не существует, то она создает пустой файл и открывает его. Если же файл уже существует, то она открывает его.

В обоих случаях возвращается файловый объект, а в нем курсор записи, который указывает на конец открытого файла. Теперь, если вы запишете что-либо, используя этот файловый объект, то это будет добавлено в конец файла.

Пробуем добавить текст в файл в Python

Предположим, у нас есть файл sample.txt со следующим содержимым:

Hello this is a sample file
It contains sample text
This is the end of file

Теперь добавим текст ‘hello’ в конец этого файла:

# Открыть файл с режимом доступа 'a'
file_object = open('sample.txt', 'a')
# Добавить'hello' в конец файла
file_object.write('hello')
# Закрыть файл
file_object.close()

Теперь содержимое файла sample.txt выглядит так:

Hello this is a sample file
It contains sample text
This is the end of filehello

Мы открыли файл sample.txt в режиме добавления, т.е. используя режим доступа 'a'. Когда мы передали строку в функцию write(), она добавила ее в конец файла, поскольку курсор в файловом объекте указывал на него. Таким образом, наш текст ‘hello’ был добавлен в конец файла sample.txt.

Добавление текста в файл с помощью оператора with

Мы можем открыть файл в режиме доступа 'a', используя оператор with, а затем добавить текст в конец файла. Например:

# Открыть файл в режиме доступа 'a'
with open("sample.txt", "a") as file_object:
    # Добавить 'hello' в конец файла
    file_object.write("hello")

Содержимое файла sample.txt после добавления строки:

Hello this is a sample file
It contains sample text
This is the end of filehellohello

Текст ‘hello’ снова добавляется в конец файла sample.txt. Основное отличие этого подхода от предыдущего в том, что нам не нужно закрывать файл явно. Он автоматически закрывается, когда заканчивается блок with.

В обоих приведенных выше примерах текст добавляется в конец файла без перехода на новую строку. Но могут возникнуть ситуации, когда нам понадобится добавить текст в файл с новой строки. Давайте посмотрим, как это делается в Python.

Как в Python добавить текст в файл с новой строки

Решение для этого немного сложное. Давайте начнем с базового подхода, а затем доработаем его.

Основной подход:

  • Открыть файл в режиме добавления ('a'). Курсор записи указывает на конец файла.
  • Добавить \n в конец файла с помощью функции write().
  • Добавить заданную строку в файл с помощью функции write().
  • Закрыть файл

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

……………………
Добавленная строка

Сначала записывается пустая строка, а затем строка, которую мы добавляем. Но в данном случае достаточно добавить только нашу строку, нам не нужно писать \n перед этим.

Поэтому наш окончательный алгоритм действий должен быть таким:

  • Открыть файл в режиме добавления и чтения ('a+'). Курсор чтения и записи указывает на конец файла.
  • Переместить курсор чтения в начало файла.
  • Прочитать текст из файла и проверить, пуст ли файл.
  • Если файл не пуст, то добавить \n в конец файла с помощью функции write().
  • Добавить заданную строку в файл с помощью функции write().
  • Закрыть файл

Это решение будет работать в обоих сценариях. Давайте применим его на практике. Предположим, у нас есть файл sample2.txt со следующим содержимым:

Hello this is a sample file
It contains sample text
This is the end of file
# Открыть файл в режиме добавления и чтения ('a+')
with open("sample2.txt", "a+") as file_object:
    # Переместить курсор чтения к началу файла
    file_object.seek(0)
    # Если файл не пуст, добавить '\n'
    data = file_object.read(100)
    if len(data) > 0 :
        file_object.write("\n")
    # Добавить текст в конец файла
    file_object.write("hello hi")

Примечание редакции: о функции seek можно почитать в статье “Файловые методы Python”.

Теперь содержимое файла sample2.txt выглядит так:

Hello this is a sample file
It contains sample text
This is the end of file
hello hi

В конце файла добавляется новая строка.

Режим доступа к файлу 'a+', открывает его как для чтения, так и для записи. Также, если файл не существует, то он создается. Первоначально оба курсора, чтения и записи, будут направлены в конец файла. Мы переместили курсор чтения в начало файла, чтобы проверить, пуст ли файл. Если файл не пуст, то сначала добавляем \n в конец файла, а затем добавляем строку.

Давайте перенесем этот код в отдельную функцию:

def append_new_line(file_name, text_to_append):
    """Добавление текста в виде новой строки в конец файла"""
    # Открыть файл в режиме добавления и чтения ('a+')
    with open(file_name, "a+") as file_object:
        # Переместить курсор чтения к началу файла
        file_object.seek(0)
        # Если файл не пуст, добавить '\n'
        data = file_object.read(100)
        if len(data) > 0:
            file_object.write("\n")
        # Добавить текст в конец файла
        file_object.write(text_to_append)

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

# Добавить одну строку к файлу, которого пока не существует
append_new_line('sample3.txt', 'This is first line')

Создастся файл sample3.txt, а его содержимое будет таким:

This is first line

Перед нашей строкой не добавлен переход на новую строку (\n), потому что файл был пуст.

Теперь давайте добавим еще одну строку в тот же файл, чтобы проверить, все ли работает нормально:

# Добавить еще одну строку в уже существующий файл, в котором есть какое-то содержимое
append_new_line('sample3.txt', 'This is second line')

Теперь содержимое файла sample3.txt будет следующим:

This is first line
This is second line

Поскольку файл уже существует и имеет содержимое, сначала в него добавляется ‘\n’, а затем наша строка.

Как добавить несколько строк в файл в Python

Предположим, у нас есть список строк:

list_of_lines = ['First Line', 'Second Line', 'Third Line']

Мы хотим добавить каждый элемент списка в виде строки в файл. Как это сделать?

Мы могли бы вызвать созданную выше функцию append_new_line() несколько раз, но это не оптимизированное решение, поскольку оно будет открывать и закрывать файл для каждого элемента в списке. Нам нужно открыть файл только один раз и добавить в него все строки. Для этого наш алгоритм должен выглядеть следующим образом:

  • Открыть файл в режиме добавления и чтения ('a+'). Курсор чтения и записи указывает на конец файла.
  • Переместить курсор чтения в начало файла.
  • Прочитать текст из файла и проверить, пуст ли файл.
  • Если файл не пуст, то установить appendEOL как True, иначе False.
  • Теперь для каждого элемента в списке:
    • Если это первый элемент в списке и appendEOL равен False, не добавлять \n в конец файла.
    • Иначе – добавить \n в конец файла с помощью функции write().
    • Добавить элемент в файл с помощью функции write().
  • Закрыть файл

В принципе, нам не нужно писать первое ‘\n’, если файл пуст.

Функция для добавления нескольких строк в файл:

def append_multiple_lines(file_name, lines_to_append):
    # Открыть файл в режиме добавления и чтения ('a+')
    with open(file_name, "a+") as file_object:
        appendEOL = False
        # Переместить курсор чтения к началу файла
        file_object.seek(0)
        # Проверить, пуст ли файл
        data = file_object.read(100)
        if len(data) > 0:
            appendEOL = True
        # Перебрать все строки в списке
        for line in lines_to_append:
            # Если файл не пуст, добавить '\n' перед первой строкой
            # Для других строк всегда добавлять '\n' перед добавлением строки
            if appendEOL == True:
                file_object.write("\n")
            else:
                appendEOL = True
            # Добавить элемент в конец файла
            file_object.write(line)

Теперь давайте воспользуемся этой функцией. Предположим, что содержимое файла sample3.txt выглядит следующим образом:

This is first line
This is second line

У нас есть список строк:

list_of_lines = ['First Line', 'Second Line', 'Third Line']

Давайте добавим все элементы этого списка в виде отдельных строк в конец файла sample3.txt.

# Добавить строки из списка в конец файла в виде отдельных строк
append_multiple_lines('sample3.txt', list_of_lines)

Теперь содержимое файла sample3.txt следующее:

This is first line
This is second line
First Line
Second Line
Third Line

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

Полный пример выглядит следующим образом:

def append_new_line(file_name, text_to_append):
    """Append given text as a new line at the end of file"""
    # Открыть файл в режиме добавления и чтения ('a+')
    with open(file_name, "a+") as file_object:
        # Переместить курсор чтения к началу файла
        file_object.seek(0)
        # Если файл не пуст, добавить '\n'
        data = file_object.read(100)
        if len(data) > 0:
            file_object.write("\n")
        # Добавить текст в конец файла
        file_object.write(text_to_append)
def append_multiple_lines(file_name, lines_to_append):
    # Открыть файл в режиме добавления и чтения ('a+')
    with open(file_name, "a+") as file_object:
        appendEOL = False
        # Переместить курсор чтения к началу файла
        file_object.seek(0)
        # Проверить, пуст ли файл
        data = file_object.read(100)
        if len(data) > 0:
            appendEOL = True
        # Перебрать все строки в списке
        for line in lines_to_append:
            # Если файл не пуст, добавить '\n' перед первой строкой
            # Для других строк всегда добавлять '\n' перед добавлением строки
            if appendEOL == True:
                file_object.write("\n")
            else:
                appendEOL = True
            # Добавить элемент в конец файла
            file_object.write(line)
def main():
    print('Append a text to file in Python')
    # Открыть файл в режиме доступа 'a'
    file_object = open('sample.txt', 'a')
    # Добавить 'hello' в конец файла
    file_object.write('hello')
    # Закрыть файл
    file_object.close()
    print('Append a text to file in Python using "with statement"')
    # Открыть файл в режиме доступа 'a'
    with open("sample.txt", "a") as file_object:
        # Добавить'hello' в конец файла
        file_object.write("hello")
    print('Append data to a file as a new line in Python')
    # Открыть файл в режиме добавления и чтения ('a+')
    with open("sample2.txt", "a+") as file_object:
        # Переместить курсор чтения к началу файла
        file_object.seek(0)
        # Если файл не пуст, добавить '\n'
        data = file_object.read(100)
        if len(data) > 0 :
            file_object.write("\n")
        # Добавить текст в конец файла
        file_object.write("hello hi")
    # Добавить одну строку в несуществующий файл
    append_new_line('sample3.txt', 'This is first line')
    # Добавить еще одну строку в файл, который уже существует и имеет какое-то содержимое
    append_new_line('sample3.txt', 'This is second line')
    print('Append multiple lines to a file in Python')
    list_of_lines = ['First Line', 'Second Line', 'Third Line']
    # Добавить строки из списка как отдельные новые строки в конец файла
    append_multiple_lines('sample3.txt', list_of_lines)
if __name__ == '__main__':
   main()

Вывод:

Append a text to file in Python
Append a text to file in Python using "with statement"
Append data to a file as a new line in Python
Append multiple lines to a file in Python

Перевод статьи Varun «How To Append Text Or Lines To A File In Python?».

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *