Шаг 163.
Основы языка Python.
Работа с файлами и каталогами. Доступ к файлам с помощью модуля os
На этом шаге мы рассмотрим средства работы с файлами из этого модуля.
Модуль os содержит дополнительные низкоуровневые функции, позволяющие работать с файлами. Функциональность этого модуля зависит от используемой операционной системы.
Получить название используемой версии модуля можно с помощью атрибута name. В операционной системе Windows XP и более поздних версий атрибут имеет значение "nt":
>>> import os
>>> os.name # Значение в ОС Windows 7
'nt'
Для доступа к файлам предназначены следующие функции из модуля os:
- open(<Путь к файлу>, <Режим>[, mode=0o777]) - открывает файл и возвращает целочисленный дескриптор, с помощью которого производится дальнейшая работа
с файлом. Если файл открыть не удалось, возбуждается исключение osError или одно из исключений, являющихся подклассами класса osError (мы поговорим о них позже). В
параметре <Режим> в операционной системе Windows могут быть указаны следующие флаги (или их комбинация через символ |):
- os.O_RDONLY - чтение;
- os.O_WRONLY - запись;
- os.O_RDWR - чтение и запись;
- os.O_APPEND - добавление в конец файла;
- os.O_CREAT - создать файл, если он не существует и если не указан флаг os.O_EXCL;
- os.O_EXCL - при использовании совместно с os.O_CREAT указывает, что создаваемый файл изначально не должен существовать, в противном случае будет сгенерировано
исключение FileExistsError;
- os.O_TEMPORARY - при использовании совместно с os.O_CREAT указывает, что создается временный файл, который будет автоматически удален сразу после закрытия;
- os.O_SHORTLIVED - то же самое, что os.O_TEMPORARY, но созданный файл по возможности будет храниться лишь в оперативной памяти, а не на диске;
- os.O_TRUNC - очистить содержимое файла;
- os.O_BINARY - файл будет открыт в бинарном режиме;
- os.O_TEXT - файл будет открыт в текстовом режиме. В Windows файлы по умолчанию открываются в текстовом режиме.
Рассмотрим несколько примеров. Откроем файл на запись и запишем в него одну строку. Если файл не существует, то создадим его. Если файл существует, то очистим его;
>>> import os # Подключаем модуль
>>> mode = os.O_WRONLY | os.O_CREAT | os.O_TRUNC
>>> f = os.open(r"file.txt", mode)
>>> os.write (f, b"String1\n") # Записываем данные
8
>>> os.close (f) # Закрываем файл
Добавим еще одну строку в конец файла:
>>> mode = os.O_WRONLY | os.O_CREAT | os.O_APPEND
>>> f = os.open(r"file.txt", mode)
>>> os.write (f, b"String2\n") # Записываем данные
8
>>> os.close (f) # Закрываем файл
Прочитаем содержимое файла в текстовом режиме:
>>> f = os.open (r"file.txt", os.O_RDONLY)
>>> os.read(f, 50) # Читаем 50 байт
b'String1\nString2\n'
>>> os.close (f) # Закрываем файл
Теперь прочитаем содержимое файла в бинарном режиме:
>>> f = os.open(r"file.txt", os.O_RDONLY | os.O_BINARY)
>>> os.read(f, 50) # Читаем 50 байт
b'String1\r\nString2\r\n'
>>> os.close (f) # Закрываем файл
- read(<Дескриптор>, <Количество байтов>) - читает из файла указанное количество байтов. При достижении конца файла возвращается пустая строка. Пример:
>>> f = os.open (r"file.txt", os.O_RDONLY)
>>> os.read(f, 5), os.read(f, 5), os.read(f, 5), os.read(f, 5)
(b'Strin', b'g1\nS', b'tring', b'2\n')
>>> os.read (f, 5) # Достигнут конец файла
b''
>>> os.close(f) # Закрываем файл
- write(<Дескриптор>, <Последовательность байтов>) - записывает последовательность байтов в файл. Возвращает количество записанных байтов;
- close(<Дескриптор>) - закрывает файл;
- lseek(<Дескриптор>, <Смещение>, <Позиция>) - устанавливает указатель в позицию, имеющую смещение <Смещение>
относительно позиции <Позиция>. В качестве значения функция возвращает новую позицию указателя. В параметре <Позиция> могут быть указаны следующие атрибуты или соответствующие им значения:
- os.SEEK_SET или 0 - начало файла;
- os.SEEK_CUR или 1 - текущая позиция указателя;
- os.SEEK_END или 2 - конец файла.
Пример:
>>> f = os.open (r"file.txt", os.O_RDONLY | os.O_BINARY)
>>> os.lseek(f, 0, os.SEEK_END) # Перемещение в конец файла
18
>>> os.lseek(f, 0, os.SEEK_SET) # Перемещение в начало файла
0
>>> os.lseek(f, 9, os.SEEK_CUR) # Относительно указателя
9
>>> os.lseek(f, 0, os.SEEK_CUR) # Текущее положение указателя
9
>>> os.close(f) # Закрьшаем файл
- dup(<Дескриптор>) - возвращает дубликат файлового дескриптора;
- fdреn(<Дескриптор> [, <Режим>[, <Размер буфера>] ]) - возвращает файловый объект по указанному дескриптору. Параметры
<Режим> и <Размер буфера> имеют тот же смысл, что и в функции open (). Пример:
>>> fd = os.open (r"file.txt", os.O_RDONLY)
>>> fd
3
>>> f = os.fdopen(fd, "r")
>>> f.fileno() # Объект имеет тот же дескриптор
3
>>> f.read ()
'String1\nString2\n'
>>> f.close()
На следующем шаге мы рассмотрим класс StringlO.
Предыдущий шаг
Содержание
Следующий шаг