Когда вы открываете файл в режиме “для записи” (параметр '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?».