Для каждого файла, с которым необходимо производить операции ввода-вывода,
нужно связать специальный объект - поток. Открытие файла осуществляется
функцией open, которой нужно передать два параметра.
Первый параметр (можно также использовать именованный параметр file)
имеет значение типа str, в котором
записано имя открываемого файла. Второй параметр (можно также использовать именованный
параметр mode) —это
значение типа str, которое равно "r",
если файл открывается для чтения данных (read), "w",
если на запись (write), при этом содержимое файла очищается, и
"a" — для добавления данных в конец
файла (append). Если второй параметр не задан, то считается, что файл
открывается в режиме чтения.
Функция open возвращает ссылку на файловый объект, которую
нужно записать в переменную, чтобы потом через данный объект использовать
методы ввода-вывода. Например:
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'.
Также можно выводить данные в файл при помощи функции print,
если передать ей еще один именованный параметр file, равный
ссылке на открытый файл. Например:
output = open('output.txt', 'w')
print(a, b, c, file=output)
После окончания работы с файлом необходимо закрыть его при помощи метода
close().
Следующая программа считывает все содержимое файла input.txt,
записывает его в переменную s, а затем выводит ее в файл output.txt.
input = open('input.txt', 'r')
output = open('output.txt', 'w')
s = input.read()
output.write(s)
input.close()
output.close()
А вот аналогичная программа, но читающая данные посимвольно:
input = open('input.txt', 'r')
output = open('output.txt', 'w')
c = input.read(1)
while len(c) > 0:
output.write(c)
c = input.read(1)
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. |
Выведите в обратном порядке содержимое всего файла полностью. Для этого считайте
файл целиком при помощи метода read().
| Ввод | Вывод |
|---|---|
Beautiful is better than ugly. |
|
В выходной файл выведите все строки наибольшей длины из входного файла, не меняя их порядок.
В данной задаче удобно считать список строк входного файла целиком при помощи
метода 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: |
Зашифруйте данный текстовый файл шифром Цезаря, при этом символы первой строки файла должны циклически сдвигаться на 1, второй строки — на 2, третьей строки — на три и т.д.
В этой задаче удобно считывать файл построчно, шифруя каждую строку в отдельности.
| Ввод | Вывод |
|---|---|
Hello |
Ifmmp |
В олимпиаде по информатике принимало участие несколько человек.
Информация о результатах олимпиады записана в файле,
каждая строка которого имеет вид:
фамилия имя класс балл.
Фамилия и имя — текстовые строки, не содержащие пробелов. Класс - одно из трех чисел 9, 10, 11. Балл - целое число от 0 до 100.
Победителем олимпиады становится человек, набравший больше всех баллов. Победители определяются независимо по каждому классу.
Определите количество баллов, которое набрал победитель в каждом классе. Гарантируется, что в каждом классе был хотя бы один участник.
Выведите три числа: баллы победителя олимпиады по 9 классу, по 10 классу, по 11 классу.
В этой задаче файл необходимо считывать построчно, не сохраняя содержимое файла в памяти целиком.
| Ввод | Вывод |
|---|---|
Иванов Сергей 9 90 |
93 91 92 |
В условиях предыдущей задачи определите и выведите средние баллы участников олимпиады в 9 классе, в 10 классе, в 11 классе.
| Ввод | Вывод |
|---|---|
Иванов Сергей 9 90 |
91.5 91 92 |
В условиях предыдущей задачи определите количество школьников, ставших победителями в каждом классе. Победителями объявляются все, кто набрал наибольшее число баллов по данному классу. Гарантируется, что в каждом классе был хотя бы один участник.
Выведите три числа: количество победителей олимпиады по 9 классу, по 10 классу, по 11 классу.
| Ввод | Вывод |
|---|---|
Иванов Сергей 9 80 |
2 2 1 |
Зачет в олимпиаде проводится без деления на классы. Выведите фамилию и имя победителя олимпиады. Если таких несколько - выведите только их количество.
| Ввод | Вывод |
|---|---|
Иванов Сергей 9 90 |
Сергеев Петр |
Иванов Сергей 9 90 |
2 |
Зачет проводится отдельно в каждом классе. Победителями олимпиады становятся школьники, которые набрали наибольший балл среди всех участников в данном классе.
Для каждого класса определите максимальный балл, который набрал школьник, не ставший победителем в данном классе.
Выведите три целых числа.
| Ввод | Вывод |
|---|---|
Иванов Сергей 9 80 |
80 81 82 |
Результаты олимпиады подводятся без деления на классы. Победителем олимпиады становятся те, кто набрал больше всего баллов. Призерами олимпиады становятся участники, следующие за победителями.
Определите наибольший балл, который набрали призеры олимпиады и количество участников олимпиады, набравших такой балл. Выведите два числа: наибольший балл призера и количество участников, имеющий такой балл.
| Ввод | Вывод |
|---|---|
Иванов Сергей 9 92 |
92 2 |
В условиях предыдущей задачи выведите фамилию и имя участника олимпиады, набравшего наибольший балл, но не ставшего победителем. Если таких школьников несколько - выведите их количество.
| Ввод | Вывод |
|---|---|
Иванов Сергей 9 93 |
Петров Василий |
Иванов Сергей 9 92 |
2 |
В олимпиаде по информатике принимало участие N человек.
Информация о результатах олимпиады записана в файле, каждая из строк которого имеет вид:
фамилия имя школа балл
Фамилия и имя — текстовые строки, не содержащие пробелов. Школа — целое число от 1 до 99. Балл — целое число от 0 до 100.
Определите школы, из которых в олимпиаде принимало участие больше всего участников. Выведите номера этих школ в порядке возрастания.
В этой задаче необходимо считывать данные построчно, не сохраняя в памяти данные обо всех участниках, а только подсчитывая число участников для каждой школы.
| Ввод | Вывод |
|---|---|
Иванов Сергей 14 56 |
3 14 |
В условиях предыдущей задачи определите школы, из которых в олимпиаде принимало участие меньше всего участников (но был хотя бы один участник). Выведите номера этих школ в порядке возрастания.
| Ввод | Вывод |
|---|---|
Иванов Сергей 14 56 |
23 27 |
Известно, что фамилии всех участников — различны. Сохраните в массивах список всех участников и выведите его, отсортировав по фамилии в лексикографическом порядке.
При выводе указываете фамилию, имя участника и его балл.
| Ввод | Вывод |
|---|---|
Иванов Сергей 14 56 | Андреев Роман 75 |
Отсортируйте список участников олимпиады:
Выведите список в таком же виде, как в предыдущей задаче.
| Ввод | Вывод |
|---|---|
Иванов Сергей 14 75 |
Петров Василий 99 |
В условиях предыдущей задачи выведите в порядке возрастания номера школ, в которых есть хотя бы один победитель олимпиады.
| Ввод | Вывод |
|---|---|
Иванов Сергей 13 80 |
13 35 |
В условиях предыдущей задачи выведите в порядке возрастания номера школ, средний балл учащихся которых выше, чем средний балл всех участников олимпиады (то есть необходимо вычислить средний балл для каждой школы и средний балл по всем участникам).
| Ввод | Вывод |
|---|---|
Иванов Сергей 13 45 |
20 |
В условиях предыдущей задачи выведите в порядке возрастания номера школ, средний балл учащихся которых максимален (то есть необходимо вычислить средний балл для каждой школы и вывести те школы, средний балл для которых максимален).
| Ввод | Вывод |
|---|---|
Иванов Сергей 13 45 |
20 |
В условиях предыдущей задачи выведите номера школ, из которых был хотя бы один участник олимпиады, в порядке убывания количества участников олимпиады из этих школ. Если из двух школ было одинаковое число участников, то их номера выводятся в порядке возрастания номера школы.
| Ввод | Вывод |
|---|---|
Иванов Сергей 13 45 |
13 70 14 20 |
В условиях предыдущей задачи выведите номера школ, из которых был хотя бы один участник олимпиады, в порядке убывания среднего балла участников олимпиады из этих школ. Если для двух школ средний балл участников совпадает, то их номера выводятся в порядке возрастания номера школы.
| Ввод | Вывод |
|---|---|
Иванов Сергей 13 45 |
20 70 13 |
В условиях предыдущей задачи выведите в порядке возрастания номера школ, из которых наибольшее количество участников стало победителями олимпиады.
| Ввод | Вывод |
|---|---|
Иванов Сергей 13 70 |
20 |