Файлы – основа всего программного обеспечения. Поэтому, в конечном счете, все сводится к умению работать с файлами: создавать, удалять, открывать, закрывать и редактировать.
Сначала изучим функции открытия и закрытия, использующиеся по умолчанию.
Для того, чтобы начать работать с содержимым файла, или просто-напросто создать его, необходимо использовать функцию open(). В скобках пишется название файла. Но просто так эта функция не используется. Делается это так:
f = open(‘file.txt’, ‘r’)
Это выражение можно понимать так: открой файл file.txt и прикрепи его к переменной f. Литера r служит для указания того, зачем открывается файл. В данном случае, r означает «для чтения». К слову, это значение используется по умолчанию, поэтому литеру r можно вообще не указывать:
f = open(‘file.txt’)
Кроме r использоваться могут также и другие литеры:
- r - Для чтения (по умолчанию)
- t - В текстовом режиме (по умолчанию)
- a - Для дозаписи в существующий. Новые данные будут добавляться в конец файла
- w - Для создания нового и записи в него. Если уже такой существует, то заменяется новым
- b - В двоичном режиме
- x - Для записи , если файла не существует. Иначе – исключение (ошибка)
- + - Для чтения и записи
Если мы попробуем открыть какой-либо несуществующий файл, то интерпретатор выдаст ошибку. Обработку ошибок мы будем проходить позже. На данный момент просто необходимо помнить об этом.
Литеры могут соединяться в конструкцию типа rt, которая используется по умолчанию – чтение файла в текстовом режиме.
Если у нас уже есть какой-то определенный файл, и в нем (к нашему сожалению) уже будет определенное содержание, то, если мы используем функцию open() с литерой w, создастся новый файл с указанным именем, а старый с его содержимым будет удален. Причем без всякого подтверждения. Поэтому нужно быть внимательным.
Если файл уже существует, и необходимо просто дописать в него информацию, разместив ее в конце, то лучше всего для этого подойдет литера a. А если необходимо отредактировать информацию в файле, то это делается в несколько этапов:
- Открытие файла для чтения.
- Сохранение информации из файла.
- Закрытие файла.
- Редактирование информации.
- Открытие файла для перезаписи (литера w).
- Сохранение готовой информации в файл.
- Закрытие файла.
Теперь, когда алгоритм работы приведен, давайте ознакомимся с инструментами, с помощью которых все это становится возможным осуществить.
Функцию открытия файла open() мы уже знаем.
Теперь о том, как работать с информацией из файла. Для того, чтобы с ней можно было работать, ее необходимо прочитать из файла. Обратите внимание, что в предыдущем пункте мы не читали, а только открывали файл, присвоив его некоей переменной (в нашем случае это f).
Для того, чтобы прочитать информацию, существует метод .read(). Перед точкой указывается переменная, отождествляемая с открытым ранее файлом (в нашем случае это f). Есть и другие способы, но пока остановимся на этом.
Считываемую информацию необходимо где-то сохранить, например, в переменной. Вот как, к примеру, может выглядеть команда считывания:
s = f.read()
Если в скобках мы укажем какое-нибудь число, то из файла будет считано именно столько первых символов. Например, если укажем 1, то считается только один первый символ. Для того, чтобы считать оставшиеся, нужно будет воспользоваться методом .read() еще раз. Если снова указать определенное количество, например, 3, то считаются только3 следующих символа. И так далее. А если числа не указываем, то считывается сразу весь файл.
Тут надо сказать, что если в файле более одной строки, то в конце каждой стоит знак конца строки, предписывающий перенос на следующую строку. Этот знак интерпретируется как «\n», то есть набор символов. Это значит, что как такового переноса в текстовом файле не существует. Поэтому считанная информация будет представлять из себя одну длиннющую строку, с которой достаточно легко можно работать.
Чтобы закрыть файл, используется метод .close(), применяемый опять же к переменной, ассоциированной с открытым файлом (в нашем случае это f):
f.close()
Если забывать закрывать файл, то можно столкнуться с тем, что при попытке его просмотреть, можно обнаружить, что информация в нем или недоступна, или устарела (например, если мы уже ее отредактировали, но не закрыли файл). То есть мы не видим изменения. Это результат того, что файл не закрыт. Только после закрытия происходят изменения, т.е. они становятся доступны для следующих сессий с этим файлом.
Для того, чтобы записать что-то в файл, он, во-первых, должен быть открыт для записи, а во-вторых, информация должны иметь текстовый вид (если мы, по умолчанию, работаем в текстовом режиме). Используется для этого метод .write(), в скобках которого указывается информация, записываемая в файл. Выглядит это так:
f.write()
Кстати, как и с методом .read() процесс может представлять собой последовательную запись информации в файл. Например, при первом применении .write() записалась одна часть информации, при втором – следующая. И так далее.
Итак, давайте на примере пройдемся по всем пунктам, чтобы было понятнее.
Предположим, у нас уже имеется текстовый файл «text.txt». Кстати, для того, чтобы мы могли писать в функции open() просто название файла, без его пути, необходимо, чтобы он находился в той же директории (папке), что и запускаемая программа. Поэтому, создайте программу в какой-нибудь удобной для вас директории и запустите ее с помощью редактора (IDLE или любого другого, каким вы пользуетесь).
Допустим, в файле есть число. Например, 10. И нам необходимо это число из файла получить, умножить его на 5, и получившийся результат записать обратно в этот же файл вместо числа 10. Программа будет иметь такой вид:
f = open('text.txt')
s = f.read()
f.close()
n = int(s)
n = n * 5
s = str(n)
f = open('text.txt', 'w')
f.write(s)
f.close()
Немного пояснений. Начинаем с открытия файла и привязки его к переменной. Далее считываем содержимое и закрываем файл. Если не закроем, потом не сможем открыть для следующих манипуляций.
Далее работаем с содержимым. Так как содержимое файла по умолчанию считывается в текстовом виде, то символы «10» необходимо превратить, собственно, в число. Потом мы выполняем с числом нужное действие и превращаем результат обратно в набор символов – чтобы можно было записать в файл в текстовом опять же виде.
Далее открываем тот же самый файл, но уже в режиме w - по сути, создаем его заново. Записываем инфу в файл и не забываем его закрыть.
Чаще всего в практической жизни будут встречаться файлы с информацией, состоящей из множества строк. Такие данные удобнее будет обрабатывать с помощью массивов. Для этого существуют два способа:
- Считать информацию с помощью метода .read(), далее разбить ее на составляющие с помощью метода .split(), сохранив в список.
- Считать информацию методом .readlines(), создав список.
Понятное дело, что второй вариант лаконичнее. Как это работает? Разберем на примере.
Допустив, в файле «text.txt» есть две строки, содержащие числа. Необходимо их просуммировать и результат вывести на экран в виде «a + b = c». Программа будет иметь такой вид:
f = open('text.txt')
arr = f.readlines()
f.close()
a = int(arr[0])
b = int(arr[1])
c = a + b
print(a, '+', b, '=', c)
Открываем файл, считываем строки и сохраняем их в список, закрываем файл. Преобразуем элементы списка в числа. Складываем. Выводим в заданном формате.
Как уже было сказано, в конце строк в текстовом файле всегда стоит знак конца строки «\n». На экране перенос строки при выводе информации также срабатывает. Это надо иметь в виду. Если переносить строки в результате не нужно, то при редактировании информации необходимо эти символы удалять.
Комменты приветствуются, за палец вверх - отдельное спасибо. Удачи!
------------------------------
Список уроков Программирование на Python для начинающих. Базовый уровень
Следующий урок Срезы
Предыдущий урок Основы работы с массивами данных
------------------------------
Задания
1. Дано имя файла и целое число N (N>1). Создать файл, содержимым которого будет являться числовой ряд из первых положительных четных чисел (2, 4, …), разделенных пробелом.
2. Дан файл целых чисел, разделенных пробелом. Создать новый файл, содержащий тот же числовой ряд, но с числами в обратном порядке.
3. Дан файл с одним предложением, размещенном на первой строке. Перезаписать данный файл, записав в него все слова предложения на разных строках.
4. Даны два файла. В первом есть строка «Hello», во втором – «world!». Совместить эти два слова, записав их в новый файл в виде «Hello world!».
5. Даны три файла с одинаковым количеством чисел, расположенных в одну строку через пробел. Совместить числа из этих трех файлов в четвертый таким образом, чтобы на первой строке расположились первые числа из трех файлов, на второй – вторые числа и т.д. Разделитель чисел такой же – пробел.
6. Доработать игру из задания 3 урока 7. Теперь необходимо сделать так, чтобы программа сохраняла в файле минимальное количество попыток, т.е. рекорд игрока. Если он выиграет за меньшее количество попыток, чем раньше, то старое значение должно перезаписываться, а на экране должна появляться надпись: «Вы поставили рекорд! Отгадали число за … попыток.». Перед игрой программа должна узнавать имя игрока. Соответственно, сохранение рекордов должно происходить для каждого игрока.