Питон: работа с файлами
На серьезных олимпиадах, а также во многих других ситуациях вам надо читать данные не с клавиатуры, а из файла, и выводить данные в файл, а не на "экран". В таком случае вы должны знать имена этих файлов; в задачах они, как правило, указаны, на этом сайте имена файлов почти всегда — input.txt для входных данных и output.txt для выходных.
Во многих языках программирования ввод/вывод данных через файлы очень похож на ввод/вывод с клавиатуры — те же команды, только немного другие параметры. В питоне, к сожалению, это не так.
Ввод данных
Самый простой способ ввести данные из файла в питоне — это сразу считать их в массив строк. Это делается так:
data = open("input.txt", "r").readlines()
Здесь input.txt — файл, откуда надо считать данные, параметр "r" указывает, что вы собираетесь именно читать (read) данные, а не записывать (write, см. ниже). Команда open, как говорят, «открывает файл на чтение», а команда readlines считывает весь файл в массив строк.
Теперь data — это массив строк, каждый элемент которого — это очередная строка из входного файла. Например, если в файле было написано
1 2 3 4 5 6 some text
то data будет содержать массив ["1 2 3\n", "4 5 6\n", "some text\n"]. (Здесь "\n" — это символ перевода строки, он будет на конце каждой строки массива data, кроме, возможно, последней. Если вы считываете числа, то можете о нем не беспокоиться, а если считываете строки и он вам мешает, то, как правило, от него можно избавиться командой a = a.rstrip("\n"), где a — строка, у которого вы хотите его убрать.)
Каждый элемент массива data — это как результат отдельной команды input(), которой вы пользовались для чтения с клавиатуры. Поэтому дальше вы пишете программу так же, как писали и раньше, но вместо каждого очередного обращения к input() вы обращаетесь к очередному элементу массива data. В простых случаях все просто, в более сложных вам надо аккуратно подсчитывать, к какому именно элементу массива вам надо обратиться.
Пример. Пусть во входном файле два числа по одному на строке. Их считываем так (здесь и далее слева — пример чтения с клавиатуры, справа — из файла):
a = int(input()) b = int(input()) |
data = open("input.txt", "r").readlines()
a = int(data[0])
b = int(data[1])
|
Если же два числа в одной строке:
a, b = map(int, input().split()) |
data = open("input.txt", "r").readlines()
a, b = map(int, data[0].split())
|
Более сложный пример: сначала число N, а потом N строк по одному числу в каждой:
n = int(input())
for i in range(n):
x = int(input())
#... что-то делаем с x
|
data = open("input.txt", "r").readlines()
n = int(data[0])
for i in range(n):
x = int(data[i + 1])
#... что-то делаем с x
|
Обратите внимание на то, что здесь написано i + 1 — потому что в первой (нулевой) строке было n.
Вывод
Проще всего выводить данные — записав их в одну большую строку и выведя эту строку. Вывод строки в файл делается так:
open("output.txt", "w").write(s)
здесь s — строка, которую нужно вывести. Это должна быть именно строка, а не число и т.д. Используйте функцию str, чтобы превратить что угодно в строку, вручную добавляйте пробелы и переводы строк (перевод строки записывается так: "\n").
Пример: пусть надо вывести два числа в одну строку:
open("output.txt", "w").write(str(a) + " " + str(b))
Пусть надо вывести два числа на отдельных строках:
open("output.txt", "w").write(str(a) + "\n" + str(b))
Пусть надо вывести массив чисел по одному числу на строке:
s = ""
for x in a:
s = s + str(x) + "\n"
open("output.txt", "w").write(s)
или проще, используя строковую магию:
open("output.txt", "w").write("\n".join(a))
Имейте в виду, что такой вызов должен быть только один раз. Если вы хотите вызывать функцию write несколько раз, то надо суметь вызвать функцию open только один раз. Рекомендуемый вариант — такой:
with open("output.txt", "w") as f:
f.write("1")
f.write("2")