======file (файл)======
Файл (он же файлоподобный объект, он же поток) — объект, предоставляющий интерфейс доступа к некоему ресурсу.
Ресурс, к которому предоставляет доступ файл может являться, как настоящим файлом на диске, так и объектом, расположенном на неком устройстве хранения или коммуникации.
Примеры ресурсов:
* стандартный ввод/вывод;
* буфер в памяти;
* сокет;
* конвейер (pipe)
* и пр.
Общепринятый способ создания файлов — функция open().
Выделяют три категории файлов:
* двоичные;
* буферизированные двоичные;
* текстовые.
====open====
Открывает файл и возвращает представляющий его объект.
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) -> file
**file** : Строка или байтовая строка, представляющая путь (абсолютный, либо относительный для текущей рабочей директории) к файлу, который требуется открыть. 3.0
Либо целое, являющееся дескриптором файла (он будет закрыт при закрытии возвращаемого объекта ввода/вывода, при условии, что closefd установлен в True).
**mode=r** : Строка, обозначающая режим, в котором следует открыть файл.
**buffering=-1** : Целое. Политика буферизации. 0 — отключить буферизацию (только для двоичного режима); 1 — построчная буферизация (только для текстового режима); > 1 — размер буфера в байтах. Если не указана, используются политика буферизации по умолчанию (см. ниже).
**encoding=None** : Имя кодировки для кодирования/декодирования файла. Следует указывать только для текстовых файлов. Если не указана, используется системная кодировка: для определения вызывается locale.getpreferredencoding(False). При чтении и записи двоичных файлов указывать кодировку не следует. Список поддерживаемых кодировок можно найти в модуле codecs.
**errors=None** : Строка, обозначающая режим, в котором будут обрабатываться ошибки кодирования/декодирования. Следует использовать только для текстовых файлов. В модуле codecs предопределено несколько режимов, пользовательские могут быть зарегистрированы при помощи codecs.register_error().
**newline=None** : Строка, определяющая режим работы универсальных переводов строк. Следует использовать только для текстовых файлов. Варианты: None, пустая строка, \n, \r, и \r\n. None — при чтении потока будут использованы универсальные переводы строк (\n, \r и \r\n будут преобразованы в \n); при записи — \n преобразуются в разделитель, используемый в системе (os.linesep). Пустая строка — при чтении также используются универсальные переводы строк, однако символы не будут преобразованы в \n; при записи преобразование не происходит. Другие значения — при чтении разбивка на строки осуществляется при помощи значения, преобразование не производится; при записи \n преобразуются в указанное значение.
**closefd=True** : Флаг необходимости закрытия файлового дескриптора. Используется только, если в file указан дескриптор, иначе возбуждается исключение. Если False, то дескриптор будет оставлен открытым даже после закрытия файла.
**opener=None** : Пользовательский объект, поддерживающий вызов, который следует использовать для открытия файла. Этот объект получая на входе file и flags, должен возвращать открытый дескриптор файла (возврат os.open и None при этом функционально идентичны).
Использование оператора with позволяет не вызывать явным образом метод close().
with open('myfile.txt', 'r+') as f: # Открываем на чтение и запись.
f.write('0123456789') # Пишем данные в файл.
==Режимы открытия файла==
^r | для чтения (3.0 синоним rt).|
^w | для записи (если файл существует, то будет очищен).|
^a | для добавления (на некоторых Unix-системах любая попытка записи пишет в конец файла вне зависимости от позиционирования — seek()).|
^b | постфикс двоичного режима (для операционных систем, которые различают текстовые и двоичные файлы).|
^+ | постфикс обновления (чтение + запись).|
^U | постфикс универсальных переводов строк (4.0 устарел, используйте параметр newline).|
^t | постфикс текстового режима.|
^x | эксклюзивное создание (возбуждается исключение FileExistsError, если файл уже существует).|
Примеры использования режимов:
^r | открыть текстовый файл на чтение.|
^r+b | открыть двоичный файл на чтение и запись.|
^w+b | открыть двоичный файл на чтение и запись, очистить до 0 байт.|
====file.read====
Считывает и возвращает указанное количество данных из файла.
file.read(size)
**size** : Число — максимальное количество данных, которое требуется считать. Если параметр не задан, либо число отрицательное, содержимое файла будет считано полностью.
После достижения конца файла, метод возвращает пустую строку.
Следует помнить, что считываемый файл может быть большим. В таком случае считывать его целиком нецелесообразно — он может не уместиться в оперативной памяти.
with open('my_file.txt') as f:
f.read() # 'The only line in file.\n'
f.read() # ''
with open('my_file.txt') as f:
f.read(5) # 'The o'
f.read(3) # 'nly'
====file.readline====
Считывает из файла одну строку и возвращает её.
file.readline()-> str
При считывании символ новой строки \n присутствует в конце каждой из строк. Его может не быть лишь в последней строке — это позволяет добиться однозначности: если метод возвращает пустую строку, значит достигнут конец файла; если строка содержит лишь символ \n, значит это просто очередная строка.
with open('my_file.txt') as f:
f.readline() # 'The first line.\n'
f.readline() # '\n'
f.readline() # 'The last line.\n'
f.readline() # ''
Для упрощения можно считывать строки из файла пройдя по его объекту в цикле:
with open('my_file.txt') as f:
for line in f:
print(line)
Такой подход эффективен с точки зрения расходования памяти, быстр, и выглядит хорошо.
====file.readlines====
Считывает из файла все строки в список и возвращает его.
file.readlines()-> list
with open('my_file.txt') as f:
my_lines = f.readlines() # ['The first line.\n', '\n', 'The last line.\n']
Считать файл можно также при помощи конструктора list():
with open('my_file.txt') as f:
my_lines = list(f) # ['The first line.\n', '\n', 'The last line.\n']
====file.write====
Записывает в файл указанную строку.
file.write(str)-> None | int
str : Строка, которую требуется запись в файл.
python 3.0 - Возвращает количество записанных байтов (ранее возвращал None).
with open('my_file.txt', 'w') as f:
f.write('some') # 4
Вывод в файл буферизируется, поэтому данные в файловую систему могут попасть не сразу, для форсирования записи используйте file.flush(), либо file.close().
====file.writelines====
Записывает в файл указанную последовательность строк.
file.writelines(lines)-> None
**lines** : Последовательность, которой может являться любой объект, поддерживающий итерирование и производящий строки.
with open('my_file.txt', 'w') as f:
f.writelines(['one', 'two'])
# В файле my_file.txt получим
# onetwo