Файлы в python
open()
и close()
Функцию
open()
нужно вызвать до того, как:
- read file
- write in new file
- add smth to file
- rewrite file
Usage
файл_об
- объект файла, возвращаемый функцией open()
режим
- строка, указывающая на тип файла и действия, которые нужно произвести над файлом имя_файла
Первая буква строки режим
указывает на операцию:
r
- read
w
- write. Если файла нет - будет создан. Если файл есть - будет перезаписан.
x
- write, только если такого файла еще нет, иначе выкинет FileExistsError
a
- add данных в конец файла, если он существует
Вторая буква строки режим
указывает на тип файла:
t
или ничего - текстовый файл
b
- binary
После открытия файла нужно вызвать функции для чтения/записи. Затем нужно закрыть файл, для гарантии того, что все операции записи завершены, а память освобождена. (Впрочем, оператор with может это всё автоматизировать)
Пример создания пустого файла(открытия и закрытия файла):
Проверка файла
os.path.isfile()
exists()
Write
Запись в файл w/ print()
Этот код перезаписал предыдущий 1212.txt
.
Запись в файл w/ write()
write()
не добавляет никаких пробелов или символов новой строки, в отличие от print()
:
Запись в бинарник. write()
В этом режиме читаться/записываться будут байты, а не строки:
Запись фрагментами:
Запись длинных строк
Код выше первым заходом записал 100 символов, затем - 47.
Но лучше всего юзать такой код:
Read
read()
, readline()
, readlines()
Вызвав read()
без аргументов, можно достать весь файл сразу, но будь осторожнее: файл размером 1ГБ
потребит 1ГБ
памяти.
Можно указать макс. кол-во символов, которое read() вернет за один вызов:
После того как прочитается весь файл, дальнейшие вызовы read() будут возвращать пустую строку ''
, которая рассматривается как False при проверке if not fragment
.
Кодировка
В
open()
можно также передать нужную кодировку:
Можно считывать построчно w/ readline()
:
Для текстового файла даже пустая строка имеет длину (1
- символ новой строки) и такая строка будет считаться True
. Когда весь файл будет считан, функция readline() (read()
тоже) вернет пустую строку, которая - False
.
Но всё же самый простой способ считать текстовый файл - юзать итератор, который будет возвращать по одной строке за раз. Пример ниже похож на предыдущий, но кода меньше:
Чтение бинарника. read()
Ключевое слово with()
Если забудешь закрыть файл, его закроет Python после того, как будет удалена последняя ссылка на этот файл. ⇒ если откроешь файл и не закроешь его явно, он будет закрыт автоматически по завершении функции. Файл должен быть закрыт, чтобы все оставшиеся операции записи были завершены.
В Python есть менеджеры контекста для очистки таких объектов, как открытые файлы:
После того как блок кода, расположенный под менеджером контекста завершится (или нормально, или путем генерации исключения), файл закроется автоматически.
Смена позиции. seek()
и tell()
В процессе чтения/записи Python отслеживает местоположение в файле. tell()
возвращает текущее смещение от начала файла в байтах. seek()
позволяет перейти к другому смещению в файле.
⇒ не обязательно прочитывать каждый байт файла, чтобы добраться до последнего.
Считывание всех данных от текущей позиции до конца файла:
seek()
также возвращает текущее смещение.
Можно вызвать seek()
, передав ей второй аргумент seek(offset, origin)
:
origin == 0
(по дефолту), сместится на offset байтов от начала файлаorigin == 1
, сместится на offset байтов с текущей позицииorigin == 2
, сместится на offset байтов от конца файла
Эти значения также определены в стандартном модуле os
:
⇒ последний байт можно считать разными способами:
Смена позиции на 2 байта до конца файла:
Эти функции наиболее полезны при работе с бинарниками.
Их можно юзать и для работы с текстовыми файлами, но если файл состоит не только из символов формата ASCII (каждый из которых занимает по 1 байту в памяти), будет трудно определить смещение. Ибо оно будет зависеть от кодировки текста, а самая популярная кодировка (UTF-8) использует разное кол-во байтов для разных символов.
copy()
и move()
rename()
Создание ссылок. link()
и symlink()
link()
- создает жесткую ссылку,symlink()
- символьную (soft).
islink()
проверяет, является ли файл симлинком.
chmod()
и chown()
Команда принимает сильно сжатое восьмеричное значение, в котором указаны юзер, группа и другие, кто имеет доступ.
Сделаю oops.txt
доступным для чтения только владельцу:
Есть вариант юзать (percy shmurky??😱😱) такие выражения вместо восьмеричной суеты:
remove()
Соус: Книга “Простой Python” → Глава 14. “Файлы и каталоги”