Программы могут взаимодействовать с файлами, например, читать данные из файлов и выводить результат в текстовый файл.
Для каждого файла, с которым необходимо производить операции ввода-вывода,
нужно связать специальный объект — поток. Открытие файла осуществляется
функцией 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
.
Во входном файле записано два целых числа, каждое в отдельной строке. Выведите в выходной файл их сумму.
Ввод | Вывод |
---|---|
2 |
4 |
Во входном файле записано два целых числа, которые могут быть разделены пробелами и концами строк. Выведите в выходной файл их сумму.
Указание. Считайте весь файл в строковую переменную при помощи метода read()
и разбейте ее на части при помощи метода split()
.
Ввод | Вывод |
---|---|
2 |
4 |
Во входном файле записана одна текстовая строка, возможно, содержащая пробелы. Выведите эту строку в обратном порядке.
Строка во входном файле заканчивается символом конца строки '\n'
.
Ввод | Вывод |
---|---|
hello world |
dlrow olleh |
Выведите все строки данного файла в обратном порядке.
Для этого считайте список всех строк при помощи метода readlines()
.
Последняя строка входного файла обязательно заканчивается символом '\n'
.
Ввод | Вывод |
---|---|
Beautiful is better than ugly. |
Complex is better than complicated. |
В выходной файл выведите все строки наибольшей длины из входного файла, не меняя их порядок.
В данной задаче удобно считать список строк входного файла целиком при помощи
метода readlines()
.
Ввод | Вывод |
---|---|
One |
Twenty one |
Определите, есть ли во входном файле символ '@'
. Выведите
слово YES
или NO
.
Входной файл может быть очень большим, поэтому считывать файл нужно посимвольно.
Ввод | Вывод |
---|---|
Valid email: |
YES |
Hello, world! |
NO |
Дан файл, каждая строка которого может содержать одно или несколько целых чисел, разделенных одним или несколькими пробелами.
Вычислите сумму чисел в каждой строке и выведите эту сумму (для каждой строки выводится сумма чисел в этой строке).
В данной задаче удобно считывать данные построчно.
Ввод | Вывод |
---|---|
2 2 |
4 |
В файле могут быть записаны десятичные цифры и все, что угодно. Числом назовем последовательность цифр, идущих подряд (т.е. число всегда неотрицательно).
Вычислите сумму всех чисел, записанных в файле. В данной задаче удобно считывать данные посимвольно.
Ввод | Вывод |
---|---|
123 |
600 |
Дан файл. Определите сколько в нем букв (латинского алфавита), слов, строк. Выведите три найденных числа в формате, аналогичном приведенному в примере.
Для экономии памяти читайте файл посимвольно, то есть не сохраняя целиком в памяти файл или отдельные его строки.
Ввод | Вывод |
---|---|
Beautiful is better than ugly. |
Input file contains: |
В олимпиаде по информатике принимало участие несколько человек.
Информация о результатах олимпиады записана в файле,
каждая строка которого имеет вид:
фамилия имя класс балл.
Фамилия и имя — текстовые строки, не содержащие пробелов. Класс - одно из трех чисел 9, 10, 11. Балл - целое число от 0 до 100.
Победителем олимпиады становится человек, набравший больше всех баллов. Победители определяются независимо по каждому классу.
Определите количество баллов, которое набрал победитель в каждом классе. Гарантируется, что в каждом классе был хотя бы один участник.
Выведите три числа: баллы победителя олимпиады по 9 классу, по 10 классу, по 11 классу.
В этой задаче файл необходимо считывать построчно, не сохраняя содержимое файла в памяти целиком.
Ввод | Вывод |
---|---|
Ivanov Sergey 9 90 |
93 91 92 |