Как в Python добавить текст в файл
Когда вы открываете файл в режиме “для записи” (параметр ‘w’ функции open() ), при последующем сохранении данных в этот файл старые данные, уже сохраненные в нем, заменяются новыми. Но такое поведение требуется не всегда. В этой статье мы рассмотрим, как при помощи Python добавить текст в существующий файл.
Чтобы добавить текст в файл, сначала нужно открыть этот файл с режимом доступа ‘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, а его содержимое будет таким:
Перед нашей строкой не добавлен переход на новую строку ( \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