На этом шаге мы рассмотрим операции закрытия файла, записи в файл и чтения из файла.
После открытия файла функция open () возвращает объект, с помощью которого производится дальнейшая работа с файлом. Тип объекта зависит от режима открытия файла и буферизации. Рассмотрим основные методы:
Язык Python поддерживает протокол менеджеров контекста. Этот протокол гарантирует закрытие файла вне зависимости от того, произошло исключение внутри блока кода или нет. Пример:
with open(r"file.txt", "w", encoding="cp1251") as f: f.write("Строка") # Записываем строку в файл # Здесь файл уже закрыт автоматически
>>> # Текстовый режим >>> f = open (r"file.txt", "w", encoding="cp1251") >>> f.write("Строка1\nСтрока2") # Записываем строку в файл 15 >>> f.close () # Закрываем файл >>> # Бинарный режим >>> f = open (r"file.txt", "wb") >>> f.write (bytes ("Строка 1\nСтрока2", "cp1251") ) 15 >>> f.write (bytearray ("\nСтрока3", "cp1251")) 8 >>> f.close ()
>>> # Текстовый режим >>> f = open(r"file.txt", "w", encoding="cp1251") >>> f.writelines( ["Строка1\n", "Строка2"]) >>> f.close () >>> # Бинарный режим >>> f = open(r"file.txt", "wb") >>> arr = [bytes ("Строка1\n", "cp1251"), bytes ("Строка2", "cp1251")] >>> f.writelines (arr) >>> f.close()
>>> f = open (r"file.txt", "r") # Открываем файл для чтения >>> f.writable () False >>> f = open (r"file.txt", "w") # Открываем файл для записи >>> f.writable () True
>>> # Текстовый режим >>> with open(r"file.txt", "r", encoding="cp1251") as f: f.read() 'Строка1\nСтрока2' >>> # Бинарный режим >>> with open(r"file.txt", "rb") as f: f.read() b'\xd1\xf2\xf0\xee\xea\xe01\n\xd1\xf2\xf0\xee\xea\xe02'
Если в качестве параметра указать число, то за каждый вызов будет возвращаться указанное количество символов или байтов. Когда достигается конец файла, метод возвращает пустую строку. Пример:
>>> # Текстовый режим >>> f = openopen(r"file.txt", "r", encoding="cp1251") >>> f.read(8) # Считываем 8 символов 'Строка1\n' >>> f.read(8) # Считываем 8 символов 'Строка2' >>> f.read(8) # Достигнут конец файла '' >>> f.close ()
>>> # Текстовый режим >>> f = open(r"file.txt", "r", encoding="cp1251") >>> f.readline (), f.readline () ('Строка1\n', 'Строка2') >>> f.readline () # Достигнут конец файла '' >>> f.close () >>> # Бинарный режим >>> f = open(r"file.txt", "rb") >>> f.readline (), f.readline () (b'\xd1\xf2\xf0\xee\xea\xe01\r\n', b'\xd1\xf2\xf0\xee\xea\xe02') >>> f.readline () # Достигнут конец файла b'' >>> f.close ()
Если в необязательном параметре указано число, то считывание будет выполняться до тех пор, пока не встретится символ новой строки (\n), символ конца файла или из файла не будет прочитано указанное количество символов. Иными словами, если количество символов в строке меньше значения параметра, то будет считана одна строка, а не указанное количество символов, а если количество символов в строке больше, то возвращается указанное количество символов. Пример:
>>> f = open(r"file.txt", "r", encoding="cp1251") >>> f.readline (2) , f.readline (2) ('Ст', 'ро') >>> f.readline (100) # Возвращается одна строка, а не 100 символов 'ка1\n' >>> f.close ()
>>> # Текстовый режим >>> with open(r"file.txt", "r", encoding="cp1251") as f: f.readlines() ['Строка1\n', 'Строка2'] >>> # Бинарный режим >>> with open(r"file.txt", "rb") as f: f.readlines() [b'\xd1\xf2\xf0\xee\xea\xe01\r\n', b'\xd1\xf2\xf0\xee\xea\xe02']
>>> # Текстовый режим >>> f = open(r"file.txt", "r", encoding="cp1251") >>> f.__next__(), f.__next__() ('Строка1\n', 'Строка2') >>> f.__next__() # Достигнут конец файла Traceback (most recent call last): File "<pyshell#59>", line 1, in <module> f.__next__() # Достигнут конец файла StopIteration >>> f.close ()
Благодаря методу __next__() мы можем перебирать файл построчно с помощью цикла for. Цикл for на каждой итерации будет автоматически вызывать метод __next__(). Для примера выведем все строки, предварительно удалив символ перевода строки:
>>> f = open(r"file.txt", "r", encoding="cp1251") >>> for line in f: print (line.rstrip ("\n"), end=" ") Строка1 Строка2 >>> f.close ()
На следующем шаге мы рассмотрим остальные операции с файлами.