Python · Синтаксис · Начальный уровень

Работа с файлами: чтение и запись

10 задач

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

Открытие и чтение файлов

#
Файл в Python открывается с помощью open(), которая возвращает файловый объект. Первый аргумент — имя файла, второй — режим, а кодировку следует почти всегда указывать явно. ```python file = open("note.txt", "r", encoding="utf-8") content = file.read() file.close() print(content) ``` "r" — режим чтения, файл должен уже существовать. read() загружает всё содержимое файла как одну строку. close() освобождает файловый дескриптор. Забыть close — это утечка ресурсов. Оператор with обрабатывает закрытие автоматически, даже если возникнет исключение: ```python with open("note.txt", "r", encoding="utf-8") as file: content = file.read() print(content) ``` После выхода из блока with файл закрывается. Это стандартный паттерн — всегда используйте with. readlines() даёт список строк, каждая с символом новой строки в конце: ```python with open("tasks.txt", "r", encoding="utf-8") as file: lines = file.readlines() print(len(lines)) # количество строк for line in lines: print(line.strip()) # strip() удаляет завершающий ``` Итерирование непосредственно по файловому объекту тоже работает и является эффективным по памяти для больших файлов: ```python with open("tasks.txt", "r", encoding="utf-8") as file: for line in file: print(line.strip()) ```

Запись и дозапись

#
Запись в файл использует режим "w". Если файл не существует — Python его создаёт. Если он уже существует — "w" полностью перезаписывает его, предыдущее содержимое исчезает. ```python with open("message.txt", "w", encoding="utf-8") as file: file.write("Hello, file!") ``` write() не добавляет новую строку автоматически. Чтобы записать несколько строк, включайте \n явно или используйте writelines() со списком строк, уже заканчивающихся на \n: ```python products = ["bread", "milk", "cheese"] with open("shopping.txt", "w", encoding="utf-8") as file: for item in products: file.write(item + "\n") ``` Дозапись с помощью "a" добавляет содержимое в конец файла, не стирая то, что уже есть: ```python with open("log.txt", "a", encoding="utf-8") as file: file.write("New entry\n") ``` Используйте "a" для журналов, "w" для файлов, которые генерируете каждый раз заново. Выбор важен: "w" для журнала уничтожит все предыдущие записи. Чтобы прочитать файл, изменить содержимое и записать обратно: ```python with open("text.txt", "r", encoding="utf-8") as file: content = file.read() with open("text.txt", "w", encoding="utf-8") as file: file.write(content.upper()) ``` Два отдельных блока with — один для чтения, другой для записи. Открытие одного файла одновременно для "r" и "w" может вызвать проблемы в зависимости от ОС.

Паттерны обработки файлов

#
Создание файла с начальным содержимым и чтение его обратно — многие задачи следуют этой двухшаговой форме: ```python with open("words.txt", "w", encoding="utf-8") as file: file.write("code python file student") with open("words.txt", "r", encoding="utf-8") as file: content = file.read() words = content.split() longest = max(words, key=len) print(longest) ``` max(iterable, key=function) находит элемент, для которого функция возвращает наибольшее значение. max(words, key=len) находит самое длинное слово без написания цикла. Фильтрация строк и запись их в новый файл: ```python with open("emails.txt", "r", encoding="utf-8") as file: lines = file.readlines() with open("valid_emails.txt", "w", encoding="utf-8") as file: for line in lines: if "@" in line: file.write(line) ``` Запись вычисленного отчёта в отдельный файл: ```python with open("article.txt", "r", encoding="utf-8") as file: content = file.read() word_count = len(content.split()) with open("report.txt", "w", encoding="utf-8") as file: file.write(f"Word count: {word_count}\n") ``` Числа и другие нестроковые значения нужно преобразовывать в строки перед записью. F-строки делают это автоматически. Передача целого числа напрямую в write() вызывает TypeError.

Быстрый справочник: операции с файлами

#
**Режимы файла** | Режим | Значение | Если файл существует | Если файл отсутствует | |---|---|---|---| | `'r'` | чтение | открывается | `FileNotFoundError` | | `'w'` | запись | **перезаписывает** | создаёт новый | | `'a'` | добавление | добавляет в конец | создаёт новый | | `'r+'` | чтение + запись | открывается | `FileNotFoundError` | Всегда добавляйте `encoding='utf-8'` чтобы избежать платформо-зависимых проблем. **Стандартный паттерн — всегда использовать `with`** ```python with open('file.txt', 'r', encoding='utf-8') as f: content = f.read() # весь файл как одна строка with open('file.txt', 'w', encoding='utf-8') as f: f.write('текст\n') # write() не добавляет перенос строки автоматически ``` **Методы чтения** | Метод | Возвращает | Использовать когда… | |---|---|---| | `f.read()` | весь файл как `str` | небольшие файлы, нужно всё содержимое | | `f.readline()` | одна строка с `\n` | чтение по одной строке | | `f.readlines()` | список строк с `\n` | нужны все строки как список | | `for line in f:` | одна строка за итерацию | большие файлы, эффективно по памяти | **Методы записи** ```python f.write('текст') # записать строку (без авто-переноса) f.write('строка\n') # добавить \n явно f.writelines(['a\n', 'b\n']) # записать список — переносы не добавляются ``` **Типичные паттерны** ```python # Прочитать все строки, убрать пробелы with open('f.txt', 'r', encoding='utf-8') as f: lines = [line.strip() for line in f] # Записать список элементов, по одному на строку with open('f.txt', 'w', encoding='utf-8') as f: f.write('\n'.join(items)) # Прочитать, преобразовать, записать обратно with open('f.txt', 'r', encoding='utf-8') as f: text = f.read() with open('f.txt', 'w', encoding='utf-8') as f: f.write(text.upper()) # Добавить запись в лог with open('log.txt', 'a', encoding='utf-8') as f: f.write(f'запись\n') ``` **Типичные ошибки** ```python f.write(42) # TypeError — должна быть str, используйте str(42) open('f.txt', 'w') # 'w' сразу стирает существующее содержимое # забыть encoding= вызывает ошибки с не-ASCII текстом ```
01

Прочитать весь файл.

#

Создайте файл note.txt с текстом "Python files". Затем откройте этот файл на чтение, прочитайте всё содержимое и выведите его в терминал.

file_name = "note.txt"
Решение
file_name = "note.txt"

with open(file_name, "w", encoding="utf-8") as file:
    file.write("Python files")

with open(file_name, "r", encoding="utf-8") as file:
    text = file.read()

print(text)
02

Записать строку в файл.

#

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

text = input("Введите сообщение: ")
file_name = "message.txt"

Решение
text = input("Введите сообщение: ")
file_name = "message.txt"

with open(file_name, "w", encoding="utf-8") as file:
    file.write(text)

with open(file_name, "r", encoding="utf-8") as file:
    result = file.read()

print(result)
03

Добавить строку в конец файла.

#

В файле log.txt уже есть строка "Start". Пользователь вводит новую строку. Добавьте её в конец файла с новой строки и выведите итоговое содержимое файла.

file_name = "log.txt"

with open(file_name, "w", encoding="utf-8") as file:
    file.write("Start")

new_line = input("Новая строка: ")
Решение
file_name = "log.txt"

with open(file_name, "w", encoding="utf-8") as file:
    file.write("Start")

new_line = input("Новая строка: ")

with open(file_name, "a", encoding="utf-8") as file:
    file.write("\n" + new_line)

with open(file_name, "r", encoding="utf-8") as file:
    text = file.read()

print(text)
04

Подсчитать строки в файле.

#

Создайте файл tasks.txt с тремя строками: "Learn", "Practice", "Repeat". Прочитайте файл и выведите количество строк.

file_name = "tasks.txt"

Решение
file_name = "tasks.txt"

with open(file_name, "w", encoding="utf-8") as file:
    file.write("Learn\nPractice\nRepeat")

with open(file_name, "r", encoding="utf-8") as file:
    lines = file.readlines()

print("Количество строк:", len(lines))

# или так можно: считать строки в цикле
file_name = "note.txt"
count = 0

with open(file_name, "r", encoding="utf-8") as file:
    for line in file:
        count += 1

print(count)
05

Найти самое длинное слово.

#

Создайте файл words.txt со словами через пробел: "code python file student". Прочитайте файл и выведите самое длинное слово.

file_name = "words.txt"

Решение
file_name = "words.txt"

with open(file_name, "w", encoding="utf-8") as file:
    file.write("code python file student")

with open(file_name, "r", encoding="utf-8") as file:
    text = file.read()

words = text.split()
longest = words[0]

for word in words:
    if len(word) > len(longest):
        longest = word

print(longest)
06

Записать список покупок.

#

Есть список покупок: ["хлеб", "молоко", "сыр"]. Запишите каждый элемент списка в файл shopping.txt с новой строки. Затем прочитайте файл и выведите содержимое.

products = ["хлеб", "молоко", "сыр"]
file_name = "shopping.txt"

Решение
products = ["хлеб", "молоко", "сыр"]
file_name = "shopping.txt"

with open(file_name, "w", encoding="utf-8") as file:
    for product in products:
        file.write(product + "\n")

with open(file_name, "r", encoding="utf-8") as file:
    text = file.read()

print(text)
07

Сумма чисел из файла.

#

Создайте файл numbers.txt, где числа записаны через пробел: 5 10 15 20. Прочитайте файл, посчитайте сумму чисел и выведите результат.

file_name = "numbers.txt"
Решение
file_name = "numbers.txt"

with open(file_name, "w", encoding="utf-8") as file:
    file.write("5 10 15 20")

with open(file_name, "r", encoding="utf-8") as file:
    text = file.read()

numbers = text.split()
total = 0

for number in numbers:
    total += int(number)

print("Сумма:", total)
08

Фильтр строк по символу.

#

Создайте файл emails.txt с несколькими строками, часть из которых содержит символ @. Прочитайте файл и запишите только строки с @ в новый файл valid_emails.txt. Затем выведите содержимое нового файла.

file_name = "emails.txt"
result_file = "valid_emails.txt"

Решение
file_name = "emails.txt"
result_file = "valid_emails.txt"

with open(file_name, "w", encoding="utf-8") as file:
    file.write("[email protected]\nhello\[email protected]\ntest")

with open(file_name, "r", encoding="utf-8") as file:
    lines = file.readlines()

with open(result_file, "w", encoding="utf-8") as file:
    for line in lines:
        if "@" in line:
            file.write(line)

with open(result_file, "r", encoding="utf-8") as file:
    text = file.read()

print(text)
09

Перезаписать файл в верхнем регистре.

#

Создайте файл text.txt со строкой "hello file". Прочитайте содержимое, переведите его в верхний регистр и перезапишите этот же файл новым текстом. Затем выведите итоговое содержимое.

file_name = "text.txt"

Решение
file_name = "text.txt"

with open(file_name, "w", encoding="utf-8") as file:
    file.write("hello file")

with open(file_name, "r", encoding="utf-8") as file:
    text = file.read()

text = text.upper()

with open(file_name, "w", encoding="utf-8") as file:
    file.write(text)

with open(file_name, "r", encoding="utf-8") as file:
    result = file.read()

print(result)
10

Отчёт с количеством слов.

#

Создайте файл article.txt с несколькими словами. Прочитайте файл, посчитайте количество слов и запишите в файл report.txt строку вида "Количество слов: N". Затем выведите содержимое report.txt.

article_file = "article.txt"
report_file = "report.txt"

Решение
article_file = "article.txt"
report_file = "report.txt"

with open(article_file, "w", encoding="utf-8") as file:
    file.write("Python helps practice file reading and writing")

with open(article_file, "r", encoding="utf-8") as file:
    text = file.read()

words = text.split()
count = len(words)

with open(report_file, "w", encoding="utf-8") as file:
    file.write(f"Количество слов: {count}")

with open(report_file, "r", encoding="utf-8") as file:
    result = file.read()

print(result)