Перейти к содержимому

Как дописать в файл python

  • автор:

Построчные чтение и запись — Python: Основы текстового ввода-вывода

В предыдущем уроке мы упоминали, что последовательные вызовы метода write дописывают текст в конец. Но часто мы имеем итератор, выдающий некий текст построчно. Можно, конечно, написать цикл, однако есть способ и получше: метод writelines . Работает он так:

f = open("foo.txt", "w") f.writelines(["cat\n", "dog\n"]) f.close() f = open("foo.txt", "r") print(f.read()) # => cat # => dog f.close() 

Как вы видите, все строчки записались в нужном порядке. Такой вариант записи предпочтителен, когда нужно записать большой объем текста, который вы получаете и обрабатываете строчка-за-строчкой. Можно предварительно накопить весь текст в одну большую строку, однако для этого может потребоваться большой объём памяти. Гораздо лучше записывать строчки по мере готовности и writelines для этого подходит идеально!

Чтение файла построчно

Файл построчно можно не только писать, но и читать:

f = open("foo.txt") f.readline() # 'cat\n' f.readline() # 'dog\n' f.readline() # '' f.close() 

Здесь Python сам понимает, что строчки в тексте нужно разделять по символу перевода строки. Вызов readline перемещает позицию к следующей строке и как только текст закончится, все последующие вызовы будут возвращать пустую строку.

Заметьте, строчки текста содержат и сами символы перевода строки.

Метод readline довольно удобен, когда мы хотим управлять процессом чтения из файла. Однако часто нужно просто прочитать все строчки текста. Для этого нужно всего навсего. проитерировать файловый объект! При этом вы получите итератор строчек, который можно читать в цикле:

f = open("foo.txt") for l in f: print(l) # => cat # => dog f.close() 

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

Подумайте, почему напечатались лишние пустые строчки.

Итератор строчек файла, как и положено, ленив. Он вычитывает строки лишь по мере необходимости. А останавливается тогда, когда читать уже становится нечего.

Ленивость позволяет, в частности, не дочитать файл:

f = open("foo.txt") for l in f: print(l) break # => cat print(f.read()) # => dog f.close() 

Если же нужно получить сразу все строчки текста в виде списка, то можно вызывать метод readlines и получить тот самый список.

Потоковая обработка больших файлов

Использование итераторов очень удобно для потоковой обработки файлов. При потоковой обработке нет необходимости хранить весь файл в памяти, а значит обрабатываемые файлы могут быть очень большими! Вот так может выглядеть скрипт, который нумерует строчки входного файла и записывает в выходной:

input_file = open("input.txt", "r") output_file = open("output.txt", "w") for i, line in enumerate(input_file, 1): output_file.write(f"i>) line>") input_file.close() output_file.close() 

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

Запись в файл Python. Перезапись файла Python

Высокоуровневый язык Python 3 имеет множество полезных средств, позволяющих взаимодействовать с текстовыми файлами. Вы можете как создавать документы для хранения информации, так и выполнять чтение, запись и удаление данных.

Сегодня поговорим о создании и записи файлов.

Создание файла, его открытие и закрытие

Работа с текстовым файлом в Python начинается с момента вызова функции open. Она принимает в качестве атрибутов путь к объекту на ПК и режим обработки. Вы можете указать абсолютный путь (это адрес размещения на жёстком диске) или относительный (речь идёт о координатах относительно папки проекта).

Что касается режима обработки файла, то при его выборе учитывайте его назначение («r» — для чтения, «w» — для записи). Таблица ниже позволит вам ознакомиться с режимами доступа к файлу в Python:

1-20219-89defb.png

А вот пример простейшего взаимодействия с текстовым документом:

 
file = open("otus.txt", "w") file.write("hello world") file.close()

Здесь функция open принимает относительный путь, открывая его для записи. При этом, если в папке файл otus.txt будет отсутствовать, метод open создает его автоматически, после чего откроет для него нужный режим обработки.

Метод close закрывает файл, а это необходимо сделать, выполнив нужные вам действия с переменной file (иначе потеряете информацию). Впрочем, можно обойтись и без close, используя связку операторов with as (переменная, которая ссылается на файл, должна быть прописана после конструкции):

 
with open("otus.txt", "w") as file: file.write("hello world")

Метод write() для записи в файл в Python

В предыдущих примерах мы уже использовали метод write() . Он позволяет записывать любую строку в открытый файл. Помните, что строки в Python способны содержать не только текст, но и двоичные данные.

Запись в файл построчно выполняется посредством записи нужной вам строки с последующей записью \n — символа перевода строки.

Давайте ещё раз посмотрим на запись в файл с помощью метода write(). Синтаксис:

 
my_file.write(string);
 
my_file = open("otus.txt", "w") my_file.write("Люблю Python!\nЭто крутой язык!") my_file.close()

Код, представленный выше, создаст файл otus.txt , записав в него указанную строку.

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

 
lines = ["one", "two", "three"] with open(r"C:\otus.txt", "w") as file: for line in lines: file.write(line + '\n')

Этот код позволит создать небольшой массив lines, содержащий три строковых элемента: «one», «two» и «three». Благодаря функции open и связке операторов with as произойдёт открытие текстового файла otus.txt в корневом каталоге жёсткого диска C. Далее произойдёт запись всех элементов списка с помощью write. Символ \n обеспечит, чтобы каждая запись была выполнена с новой строки.

Как дозаписать файл в python

Я делаю телеграм-бота, и мне нужно записывать сообщения пользователя в файл txt. Но обычный метод .write() перезаписывает его, а мне это не нужно. Как дозаписать файл в python?

Отслеживать
задан 14 сен 2020 в 15:49
45 1 1 золотой знак 1 1 серебряный знак 5 5 бронзовых знаков
используйте open(filename, mode="a") .
14 сен 2020 в 16:01

with open('file.txt', 'r+') as f: f.seek(0, 2) f.write('blabla') а там где f.seek 0 это номер буквы, а 2 строка? Или наоборот?

3 ноя 2021 в 8:54

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Вы можете открыть файл в режиме добавления open('. ', 'a') и использовать привычный .write() . В этом случае запись будет осуществляться в конец.

А вообще запись в файл и чтение из него производятся в позиции некоего "курсора". Каждое действие над содержимым файла перемещает этот курсор. И если файл открыт в режиме "чтение и обновление" ( 'r+' ), то можно переместить курсор в конец файла с помощью метода .seek() и записать что-то всё тем же .write() . Код, дописывающий строку в конце файла, будет выглядеть как-то так:

with open('file.txt', 'r+') as f: # . f.seek(0, 2) # перемещение курсора в конец файла f.write('blabla') # собственно, запись 

Про метод seek можно почитать тут.

Как в существующий файл дописать текст в python?

у меня есть txt файл в котором есть такой текст:
dakdasjlkas:dsadsakj54fsf
dakdasjlkas:dsadsakj54fsf
adsdasjlkas:dsadsakj545sf
как мне дописать в конец каждой стрки какой-то текст?

я пробовал вот-так но этот флаг дописывает на новых строках 🙁

for i in range(3): with open('1.txt', 'a') as file: file.write('input')
  • Вопрос задан более двух лет назад
  • 1809 просмотров

Комментировать
Решения вопроса 1

text = 'input' # фраза, которая будет дописана в конец строки output = '' # инициализация результирующего текста with open('1.txt', 'r') as file: for line in file: # считывание текущего файла output += (line.replace('\n', '') + text + '\n') with open('1.txt', 'w') as file: file.write(output) # перезапись файла

Ответ написан более двух лет назад

Vindicar

Решение простое, но не очень хорошее если файл большой. Многократная конкатенация строк хорошо память отъедает.

Davidd2008 @Davidd2008 Автор вопроса

Vindicar, спасибо. Хотел реализовать программу с помощью f-строки, но не смог из-за синтаксической ошибки:

SyntaxError: f-string expression part cannot include a backslash

Vindicar

Михаил,
Раз уж ты читаешь файл целиком в память, можно было использовать список строк, и сделать ''.join() (ну или '\n'.join()). Я думаю, это будет побыстрее.

MinTnt

Vindicar, да в этой ситуации, можно просто использовать метод read(), чтоб получить весь текст, и просто ко всему тексту применить replace('\n', text+'\n') (так, как у него там есть какие-то строки, значит они с переносами, а раз так, значит каждая строка заканчивается на символ переноса, по этому мы можем просто использовать replace для всего текста), и обратно записать получившийся.

Vindicar

MinTnt, это вариант, но я вообще-то имел ввиду несколько другой аспект.

Когда ты дописываешь что-то в конец строки, что делает питон?
Выделяет память под новую строку (суммарной длины), потом копирует туда исходную строку, потом копирует туда дописываемую часть. Если исходная строка более не нужна, удаляет её. (это упрощение, но идею передаёт).
И так при каждом дописывании. Т.е. если ты к 100МБ строке дописываешь один символ, у тебя в какой-то момент будет занято два раза по 100МБ, а если дописываешь символы часто - то память будет постоянно выделяться/освобождаться.

А вот join() работает умнее. Если он может пройтись по списку строк, он это делает, суммирует их длины, выделяет блок нужного размера, и вторым проходом записывает содержимое в этот блок. Никаких многократных переносов, по крайней мере для списка строк.

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

Ответы на вопрос 2

Vindicar

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

Проще сделать иначе: создать новый файл рядом со старым, прочитать построчно старый, записать изменённые строки в новый. А потом удалить старый и переименовать новый в старый.

Насчёт последней части посмотри модуль os, в частности, os.unlink() и os.rename().

Ответ написан более двух лет назад
Комментировать
Нравится 1 Комментировать

LazyTalent

Дмитрий @LazyTalent
Data Engineer, Freelancer

1. Прочесть файл
2. Пройтись по всем строкам и дописать значение
3. Сохранить новые данные в новый файл

Ответ написан более двух лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

python

  • Python
  • +1 ещё

Как заставить селениум просто открыть страницу и ждать?

  • 1 подписчик
  • 6 минут назад
  • 13 просмотров

Добавить комментарий

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