Файлы

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

Открытие файла

Для каждого файла, с которым необходимо производить операции ввода-вывода, нужно связать специальный объект — поток. Открытие файла осуществляется функцией open, которой нужно передать минимум два параметра. Параметр file имеет значение типа str, в котором записано имя открываемого файла. Параметр mode  это значение типа str, которое равно "r", если файл открывается для чтения данных (read), "w", если на запись (write), при этом содержимое файла очищается, и "a" — для добавления данных в конец файла (append).

Функция open возвращает ссылку на файловый объект, которую нужно записать в переменную, чтобы потом через данный объект использовать методы ввода-вывода. Например:

input = open(file = 'input.txt', mode = 'r')
output = open(file = 'output.txt', mode = 'w')
То же самое можно записать и компактнее:
input = open('input.txt', 'r')
output = open('output.txt', 'w')

Чтение данных из файла

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

Метод readline() считывает одну строку из файла (до символа конца строки '\n', возвращается считанная строка вместе с символом '\n'. Если считывание не было успешно (достигнут конец файла), то возвращается пустая строка. Для удаления символа '\n' из конца файла удобно использовать метод строки rstrip(). Например: s = s.rstrip().

Метод readlines() считывает все строки из файла и возвращает список из всех считанных строк (одна строка — один элемент списка). При этом символы '\n' остаются в концах строк.

Метод read() считывает все содержимое из файла и возвращает строку, которая может содержать символы '\n'. Если методу read передать целочисленный параметр, то будет считано не более заданного количества символов. Например, считывать файл побайтово можно при помощи метода read(1).

Вывод данных в файл

Данные выводятся в файл при помощи метода write, которому в качестве параметра передается одна строка. Этот метод не выводит символ конца строки '\n' (как это делает функция print при стандартном выводе), поэтому для перехода на новую строку в файле необходимо явно вывести символ '\n'.

Закрытие файла

После окончания работы с файлом необходимо закрыть его при помощи метода close().

Пример

Следующая программа считывает все содержимое файла input.txt, записывает его в переменную s, а затем выводит ее в файл output.txt.

input = open(file = 'input.txt', mode = 'r')
output = open(file = 'output.txt', mode = 'w')
s = input.read()
output.write(s)
input.close()
output.close()

А вот аналогичная программа, но читающая данные посимвольно:

input = open(file = 'input.txt', mode = 'r')
output = open(file = 'output.txt', mode = 'w')
c = input.read(1)
while len(c) > 0:
    output.write(c)
    c = input.read()
input.close()
output.close()

Смотрите также:

Упражнения

Входные данные для всех задач записаны в файле input.txt, результат работы нужно вывести в файл output.txt.

A: A + B

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

Ввод Вывод
2
2
4

B: Числа могут быть где угодно

Во входном файле записано два целых числа, которые могут быть разделены пробелами и концами строк. Выведите в выходной файл их сумму.

Указание. Считайте весь файл в строковую переменную при помощи метода read() и разбейте ее на части при помощи метода split().

Ввод Вывод
  2

 2
4

C: Обращение строки

Во входном файле записана одна текстовая строка, возможно, содержащая пробелы. Выведите эту строку в обратном порядке.

Строка во входном файле заканчивается символом конца строки '\n'.

Ввод Вывод
hello world
dlrow olleh

D: Построчное обращение

Выведите все строки данного файла в обратном порядке. Для этого считайте список всех строк при помощи метода readlines().

Последняя строка входного файла обязательно заканчивается символом '\n'.

Ввод Вывод
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Complex is better than complicated.
Simple is better than complex.
Explicit is better than implicit.
Beautiful is better than ugly.

F: Длинные строки

В выходной файл выведите все строки наибольшей длины из входного файла, не меняя их порядок.

В данной задаче удобно считать список строк входного файла целиком при помощи метода readlines().

Ввод Вывод
One
Twenty one
Two
Twenty two
Twenty one
Twenty two

G: Поиск символа

Определите, есть ли во входном файле символ '@'. Выведите слово YES или NO.

Входной файл может быть очень большим, поэтому считывать файл нужно посимвольно.

Ввод Вывод
Valid email:
Bilbo.Baggins@bagend.hobbiton.shire.me
YES
Hello, world!
NO

H: Сумма чисел в строкaх

Дан файл, каждая строка которого может содержать одно или несколько целых чисел, разделенных одним или несколькими пробелами.

Вычислите сумму чисел в каждой строке и выведите эту сумму (для каждой строки выводится сумма чисел в этой строке).

В данной задаче удобно считывать данные построчно.

Ввод Вывод
2 2
3 4
1 5
4
7
6

I: Сумма чисел в файле

В файле могут быть записаны десятичные цифры и все, что угодно. Числом назовем последовательность цифр, идущих подряд (т.е. число всегда неотрицательно).

Вычислите сумму всех чисел, записанных в файле. В данной задаче удобно считывать данные посимвольно.

Ввод Вывод
 123
aaa456
1x2y3 4 5 6
600

J: Статистика по файлу

Дан файл. Определите сколько в нем букв (латинского алфавита), слов, строк. Выведите три найденных числа в формате, аналогичном приведенному в примере.

Для экономии памяти читайте файл посимвольно, то есть не сохраняя целиком в памяти файл или отдельные его строки.

Ввод Вывод
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Input file contains:
108 letters
20 words
4 lines

L: Максимальный балл по классам

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

Фамилия и имя — текстовые строки, не содержащие пробелов. Класс - одно из трех чисел 9, 10, 11. Балл - целое число от 0 до 100.

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

Определите количество баллов, которое набрал победитель в каждом классе. Гарантируется, что в каждом классе был хотя бы один участник.

Выведите три числа: баллы победителя олимпиады по 9 классу, по 10 классу, по 11 классу.

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

Ввод Вывод
Ivanov Sergey 9 90
Sergeev Petr 10 91
Petrov Vassily 11 92
Vasilyev Ivan 9 93
93 91 92