В этом семестре мы будем работать только с текстовыми файлами
Как хранится текст в памяти, в файлах? Компьютер умеет работать только с данными, представленными в виде набора байт. Каждый байт это число от 0 до 255. Напрямую символы сохранить нельзя, поэтому каждый символ нужно превратить в число и уже после этого сохранить. Таблица, которая символам сопоставляет числа, назыавется кодировка.
Знакомые нам кодировки: utf-8, ascii, koi8r, cp1251 (стандартная для windows) и т.д.
Пример записи в файл:
# Открываем файл, получаем файловый объект в переменную f
f = open("a.txt", "w", encoding="utf-8")
# a.txt - имя файла. Он создается в текущей директории (см. позже)
# w - режим открытия, в данном случае это запись
# причем, если файл был, то он затрется и создастся пустой
f.write("первая строка\n") # команда записи в файл
f.write("вторая строка\n") # не забываем \n как символ перевода строки
# в разных ОС (win, linux) принято по-разному переводить строку. По умолчанию
# python превращает символ \n в перевод строки текущей ОС.
f.write("третья строка\n")
f.close() # файлы нельзя забывать закрывать. Это важно, потому что иначе часть информации
# может не записаться в файл, и пока файл не закрыт, к нему могут не иметь доступ другие
# программы.
Правильный способ открытия файла, который гарантирует его закрытие
with open("a.txt", "w", encoding="utf-8") as f:
f.writelines(["первая строка!\n", "вторая строка!\n", "третья строка!\n"])
Мы заодно воспользовались функцией writelines, которая позволяет за одно действие записать сразу несколько строк в файл.
with выражение as f
эквивалентно тому, что f = выражение
, и при любом выходе из блока with вызовется f.close()
Можно открывать несколько файлов:
with open("x.txt", "w", encoding="utf-8") as f, open("y.txt", "w", encoding="utf-8") as g:
f.write("hello x.txt")
g.write("hello y.txt")
Открываем аналогично, но используем режим "r".
with open("a.txt", "r", encoding="utf-8") as f:
text = f.read() # прочитать всё. Можно указать read(10), что прочитать не более 10 символов
text
'первая строка!\nвторая строка!\nтретья строка!\n'
print(text)
первая строка! вторая строка! третья строка!
with open("a.txt", "r", encoding="utf-8") as f:
text1 = f.readline() # читает строку вместе с символом перевода строки в конце, если он есть
text2 = f.readline()
text3 = f.readline()
text3 # в конце есть перевод строки
'третья строка!\n'
Поэтому, довольно часто с прочитанными строками делают strip()
: f.readline().strip()
.
Удобный способ перебора всех строк файла - это итерирование по файлу.
with open("a.txt", "r", encoding="utf-8") as f:
for line in f:
print(line.strip())
первая строка! вторая строка! третья строка!
with open("a.txt", "r", encoding="utf-8") as f:
print(f.readlines()) # читаем все строки из файла сразу в список
['первая строка!\n', 'вторая строка!\n', 'третья строка!\n']