Работа с текстовым файлом в Python от начала до конца
Варианты открытия текстового файла в Python
Основной способ. Для чтения текстового файла применяется функция open с контекстным менеджером with. Режим 'r' означает чтение, аргумент encoding задаёт кодировку. Контекстный менеджер автоматически закрывает файл после завершения блока.
with open('sample.txt', 'r', encoding='utf-8') as file:
text = file.read()
print(text)Path python 2 (путь к python 2)
Переменная text хранит содержимое и доступна после блока with.
FileNotFoundError.
Когда файл не найден, возникает FileNotFoundError. Чтобы программа не прекращала работу, исключение обрабатывают так:
try:
with open('sample.txt', 'r', encoding='utf-8') as file:
text = file.read()
except FileNotFoundError:
text = ''Python find directory (поиск директории)
Подобная защита нужна для пользовательских путей, когда нет уверенности в существовании файла.
Как открыть файл и перебрать строки без чтения всего текста в память?
Файловый объект поддерживает итерацию по строкам. Каждая строка содержит символ переноса. Для больших файлов такой способ экономит память.
with open('big.txt', 'r', encoding='utf-8') as data_file:
for current_line in data_file:
print(current_line.strip())
File does not exist python (проверка существования файла)
Метод strip убирает пробельные символы по краям строки. Если нужно сохранить пустые строки, выполняется проверка после удаления только символа переноса.
Как открыть файл и получить список всех строк?
Метод readlines собирает строки в список. Такой вариант удобен для достаточно малых файлов и для доступа по индексу.
with open('names.txt', encoding='utf-8') as name_file:
name_list = name_file.readlines()
print(name_list[0])Python path configuration (конфигурация путей python)
Для очень большого файла список занимает много памяти, поэтому лучше брать построчный цикл.
Как открыть файл через pathlib, не создавая файловый объект вручную?
Метод Path.read_text сам открывает и закрывает файл. Эта короткая запись подходит для чтения небольшого файла целиком.
from pathlib import Path
content = Path('settings.ini').read_text(encoding='utf-8')
print(content)Python installation path (путь установки python)
Если файла нет, Path.read_text вызывает FileNotFoundError. Существование пути проверяется методом exists.
Как открыть файл в старой кодировке Windows-1251?
Старые русскоязычные документы часто сохранены как cp1251. Аргумент encoding задаёт кодовую страницу.
with open('old_letter.txt', 'r', encoding='cp1251') as source:
letter_text = source.read()
print(letter_text)Python path exists (проверка существования пути в python)
Неверная кодировка порождает UnicodeDecodeError. Тогда подбирается другая кодировка или применяется errors='replace' для замены непрочитанных байтов.
Как открыть текстовый файл для записи и добавления данных?
Для перезаписи применяется режим 'w'. Содержимое файла очищается при открытии. Режим 'a' добавляет текст в конец без удаления старого содержимого.
with open('result.txt', 'w', encoding='utf-8') as target:
target.write('новая строка')Python file in folder (проверка существования файла в папке)
with open('result.txt', 'a', encoding='utf-8') as target:
target.write('добавленная строка')запись данных python (запись данных в python)
Режим 'x' создаёт файл только при отсутствии. Если такой файл существует, open вызовет FileExistsError.
Как открыть несколько текстовых файлов в одном блоке with?
В операторе with может быть несколько файловых объектов. Это полезно для копирования текста из одного файла в другой.
with open('source.txt', 'r', encoding='utf-8') as input_file, open('copy.txt', 'w', encoding='utf-8') as output_file:
output_file.write(input_file.read())
Каждый из перечисленных объектов закрывается автоматически по завершении блока.
Дополнительные примеры открытия текстовых файлов
Нумерация строк файла.
Если authors.txt содержит фамилии Чехов, Пушкин и Толстой, цикл с enumerate выводит номер и строку.
with open('authors.txt', 'r', encoding='utf-8') as authors:
for number, line in enumerate(authors, start=1):
print(f'{number}: {line.strip()}')
1: Чехов
2: Пушкин
3: Толстой
Чтение файла небольшими порциями.
Метод read(size) возвращает не более size символов. Файл digits.txt содержит строку 0123456789 без перевода строки на конце.
with open('digits.txt', 'r', encoding='utf-8') as digits:
while True:
chunk = digits.read(4)
if chunk == '':
break
print(chunk)
0123
4567
89
Открытие переменного количества файлов.
Обычный with позволяет перечислить фиксированное число открытий. Для неизвестного заранее списка файлов используется ExitStack.
from contextlib import ExitStack
file_names = ['one.txt', 'two.txt']
with ExitStack() as stack:
handles = [stack.enter_context(open(name, 'r', encoding='utf-8')) for name in file_names]
parts = [handle.read() for handle in handles]
print(parts[0])
print(parts[1])
При содержимом one.txt со словом Первый и two.txt со словом Второй вывод будет:
Первый
Второй
Последовательное чтение нескольких файлов без явных open.
Модуль fileinput открывает перечисленные файлы друг за другом и позволяет получить имя файла и общий номер строки.
import fileinput
with fileinput.input(files=('one.txt', 'two.txt'), encoding='utf-8') as joined:
for line in joined:
print(joined.filename(), joined.lineno(), line.strip())
Если one.txt содержит строки первая и вторая, а two.txt содержит строку третья, результат будет:
one.txt 1 первая
one.txt 2 вторая
two.txt 3 третья
Чтение конкретной строки через linecache.
Модуль linecache извлекает строку по номеру без длинного цикла. Это удобно при повторных обращениях к произвольным строкам.
import linecache
needed_line = linecache.getline('poets.txt', 2)
print(needed_line.strip())
Если poets.txt содержит Ахматова, Цветаева и Мандельштам, вывод будет:
Цветаева
Создание нового текстового файла без перезаписи существующего.
Режим 'x' в open предотвращает случайную потерю данных. Когда файл уже существует, выбрасывается FileExistsError.
try:
with open('draft.txt', 'x', encoding='utf-8') as fresh_file:
fresh_file.write('черновик')
except FileExistsError:
with open('draft.txt', 'r', encoding='utf-8') as existing_file:
print(existing_file.read())
Первый запуск создаёт файл и не печатает ничего. Второй запуск переходит в except и выводит содержимое файла.