Файл (он же файлоподобный объект, он же поток) — объект, предоставляющий интерфейс доступа к некоему ресурсу. Ресурс, к которому предоставляет доступ файл может являться, как настоящим файлом на диске, так и объектом, расположенном на неком устройстве хранения или коммуникации.
Примеры ресурсов:
Общепринятый способ создания файлов — функция 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 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(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()-> 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()-> 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(str)-> None | int
str : Строка, которую требуется запись в файл.
python 3.0 - Возвращает количество записанных байтов (ранее возвращал None).
with open('my_file.txt', 'w') as f: f.write('some') # 4
Записывает в файл указанную последовательность строк.
file.writelines(lines)-> None
lines : Последовательность, которой может являться любой объект, поддерживающий итерирование и производящий строки.
with open('my_file.txt', 'w') as f: f.writelines(['one', 'two']) # В файле my_file.txt получим # onetwo