Программы могут взаимодействовать с файлами, например, читать данные из файлов и выводить результат в текстовый файл.
Для каждого файла, с которым необходимо производить операции ввода-вывода,
нужно связать специальный объект — поток. Открытие файла осуществляется
функцией open
, которой нужно передать минимум два параметра.
Параметр file
имеет значение типа str
, в котором
записано имя открываемого файла. Параметр mode
это
значение типа str
, которое равно "r"
,
если файл открывается для чтения данных (read), "w"
,
если на запись (write), при этом содержимое файла очищается, и
"a"
— для добавления данных в конец
файла (append).
Функция open
возвращает ссылку на файловый объект, которую
нужно записать в переменную, чтобы потом через данный объект использовать
методы ввода-вывода. Например:
fin = open(file = "input.txt", mode = "r") fout = open(file = "output.txt", mode = "w")То же самое можно записать и компактнее:
fin = open("input.txt", "r") fout = open("output.txt", "w")
Здесь fin и fout - это обычные имена (как имена переменных), которые могут быть любыми. А input.txt и output.txt - имена файлов, которые опять же могут быть любыми.
Для файла, открытого на чтение данных, можно вызывать следующие методы, позволяющие читать данные из файла.
Метод readline()
считывает одну строку из файла (до символа
конца строки '\n'
, возвращается считанная строка вместе с символом
'\n'
. Если считывание не было успешно (достигнут конец файла),
то возвращается пустая строка. Для удаления символа '\n'
из конца
файла удобно использовать метод строки rstrip()
- он удаляет все пробелы и переводы строк в конце строки,
или метод strip()
- он делает то же самое, но не только в конце, но и в начале строки). Например:
s = s.rstrip()
.
Метод readlines()
считывает все строки из файла и возвращает
список из всех считанных строк (одна строка — один элемент списка).
При этом символы '\n'
остаются в концах строк.
Метод read()
считывает все содержимое из файла и возвращает
строку, которая может содержать символы '\n'
. Если методу
read
передать целочисленный параметр, то будет считано не более
заданного количества символов. Например, считывать файл побайтово можно
при помощи метода read(1)
.
Данные выводятся в файл при помощи метода write
,
которому в качестве параметра передается одна строка. Этот метод не выводит
символ конца строки '\n'
(как это делает функция print
при стандартном выводе), поэтому для перехода на новую строку в файле
необходимо явно вывести символ '\n'
.
Второй способ вывести данные в файл - при помощи привычной вам команды print
,
которой можно указать необязательный параметр file=
. Например:
print("Hello, world", file=fout)
После окончания работы с файлом необходимо закрыть его при помощи метода
close()
.
Следующая программа считывает все содержимое файла input.txt
,
записывает его в переменную s
, а затем выводит ее в файл output.txt
.
fin = open("input.txt", "r") fout = open("output.txt", "w") s = fin.read() print(s, end="", file=fout) fin.close() fout.close()
А вот аналогичная программа, но читающая данные посимвольно:
fin = open("input.txt", "r") fout = open("output.txt", "w") c = fin.read(1) while len(c) > 0: fout.write(c) c = fin.read() fin.close() fout.close()
Русские ьуквы и разные кодировки. Если файл содержит русские буквы, то важно понимать, в какой они записаны кодировке. Это нужно указать при открытии файла, например:
fin = open('input.txt', 'r', encoding = "utf8")В современном мире вам будут чаще всего встречаться кодировки utf8 (современная более-менее общепринятая кодировка) или cp1251 (это стандартная кодировка windows).
Использование with. Можно при открытии файлов воспользоваться оператором with, тогда их не потребуется в явном виде закрывать оператором close. Пример работы с файлами в этом случае:
with open("input.txt") as fin: with open("output.txt", "w") as fout: c = fin.read(1) while len(c) > 0: fout.write(c) c = fin.read()
Еще один пример чтения всех строчек из файла.
with open("input.txt") as fin: with open open("output.txt", "w") as fout: for curline in fin: fout.write(curline)
Режимы работы с файлами. Помимо уже обсужденных режимов "r" (от слова read) - чтение из существующего файла, и "w" (от write) - запись в новый файл (кстати, если такой файл уже существует, он будет удален и создан заново), есть еще режим "a" (append). В этом режиме если файла не существовало, он будет создан, а если существовал, то он не будет удален, а программа допишет инормацию к нему в конец. Есть и более экзотические режимы, например "rb" - открывает файл на чтение, но не как текстовый, а как бинарный файл (про это поговорим как-нибудь потом).
Входные данные для всех задач записаны в файле 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 |
Зашифруйте данный текстовый файл шифром Цезаря, при этом символы первой строки файла должны циклически сдвигаться на 1, второй строки — на 2, третьей строки — на три и т.д.
В этой задаче удобно считывать файл построчно, шифруя каждую строку в отдельности.
Примечание: в этой задаче имеются ввиду только символы-буквы. Знаки препинания, цифры, пробелы меняться не должны.
Ввод | Вывод |
---|---|
Hello |
Ifmmp |