Python поддерживает множество различных типов файлов, но условно их можно разделить на два виде: текстовые и бинарные. Текстовые файлы — это к примеру файлы с расширением cvs, txt, html, в общем любые файлы, которые сохраняют информацию в текстовом виде. Бинарные файлы — это изображения, аудио и видеофайлы и т.д. В зависимости от типа файла работа с ним может немного отличаться.
При работе с файлами необходимо соблюдать некоторую последовательность операций:
- Открытие файла с помощью метода open()
- Чтение файла с помощью метода read() или запись в файл посредством метода write()
- Закрытие файла методом close()
Открытие и закрытие файла
Чтобы начать работу с файлом, его надо открыть с помощью функции open() , которая имеет следующее формальное определение:
open(file, mode)
Первый параметр функции представляет путь к файлу. Путь файла может быть абсолютным, то есть начинаться с буквы диска, например, C://somedir/somefile.txt . Либо можно быть относительным, например, somedir/somefile.txt — в этом случае поиск файла будет идти относительно расположения запущенного скрипта Python.
Python: КАК ОТКРЫТЬ ФАЙЛ и не потерять все 👻
Второй передаваемый аргумент — mode устанавливает режим открытия файла в зависимости от того, что мы собираемся с ним делать. Существует 4 общих режима:
- r (Read). Файл открывается для чтения. Если файл не найден, то генерируется исключение FileNotFoundError
- w (Write). Файл открывается для записи. Если файл отсутствует, то он создается. Если подобный файл уже есть, то он создается заново, и соответственно старые данные в нем стираются.
- a (Append). Файл открывается для дозаписи. Если файл отсутствует, то он создается. Если подобный файл уже есть, то данные записываются в его конец.
- b (Binary). Используется для работы с бинарными файлами. Применяется вместе с другими режимами — w или r.
После завершения работы с файлом его обязательно нужно закрыть методом close() . Данный метод освободит все связанные с файлом используемые ресурсы.
Например, откроем для записи текстовый файл «hello.txt»:
myfile = open(«hello.txt», «w») myfile.close()
При открытии файла или в процессе работы с ним мы можем столкнуться с различными исключениями, например, к нему нет доступа и т.д. В этом случае программа выпадет в ошибку, а ее выполнение не дойдет до вызова метода close, и соответственно файл не будет закрыт.
В этом случае мы можем обрабатывать исключения:
try: somefile = open(«hello.txt», «w») try: somefile.write(«hello world») except Exception as e: print(e) finally: somefile.close() except Exception as ex: print(ex)
В данном случае вся работа с файлом идет во вложенном блоке try. И если вдруг возникнет какое-либо исключение, то в любом случае в блоке finally файл будет закрыт.
Однако есть и более удобная конструкция — конструкция with :
with open(file, mode) as file_obj: инструкции
Эта конструкция определяет для открытого файла переменную file_obj и выполняет набор инструкций. После их выполнения файл автоматически закрывается. Даже если при выполнении инструкций в блоке with возникнут какие-либо исключения, то файл все равно закрывается.
Как открыть питон файл в командной строке
Так, перепишем предыдущий пример:
with open(«hello.txt», «w») as somefile: somefile.write(«hello world»)
Источник: metanit.com
Работа с файлами в Python
Основы
Автор Иван Душенко На чтение 9 мин Просмотров 22.6к. Опубликовано 22.08.2021
Введение в тему
В данном уроке мы рассмотрим работу с файлами в Python. Вы узнаете, как их открывать, читать содержимое, вносить изменения и закрывать их.
Файлы python
Файл — это определенное количество информации, имеющее имя и хранящееся в долговременной памяти. Другими словами, это набор данных, которому дали имя и где-то сохранили.
В Питоне файлы делятся на две разновидности:
Текстовые файлы
Предполагается, что этот вид файлов содержит набор символов, который может прочитать человек. Как правило, такие файлы могут быть открыты любым простейшим текстовым редактором, к примеру, блокнотом в Виндовс.
Бинарные файлы
Бинарные файлы содержат набор нулей и единиц. Таким образом можно хранить любую информацию: изображения, аудио, видео и даже текст.
Работа с файлами состоит из следующих шагов:
Файл надо открыть
Произвести необходимые операции (запись или чтение)
Открытие файла
Метод open
И так, если Вы хотите произвести какие-либо операции с файлом, сперва придётся его открыть. Для этой цели в языке Пайтон есть встроенная функция open(). Используя эту функцию, можно создать на основе любого языка файла объект Python.
file = open(name, mode)
- name- имя файла, который Вы открываете
- mode- режим открытия. Если не указать этот параметр, файл будет открыт в режиме «только чтение». Режимы открытия файла могут быть следующими:
Файловый объект имеет несколько атрибутов, предоставляющих информацию о файле:
file.mode | Выводит режим доступа, с которым был открыт файл. |
file.name | Выводит имя файла. |
file.softspace | Выводит False если при выводе содержимого файла следует отдельно добавлять пробел. |
Пример
Для начала необходимо сохранить в новый файл «test.txt» какой-то текст. Этот файл должен быть расположен в рабочей папке.
Применим следующий код для открытия данного файла:
file = open(‘test.txt’, ‘r’) # открыть файл из рабочей папки в режиме чтения, относительный путь file_2 = open(‘C:\Users\Dushenko\Desktop\test.txt’, ‘r’) # открыть файл из любого каталога
В переменных file и file_2 хранятся ссылки на объекты с открытыми файлами.
Теперь посмотрим содержимое файла и информацию о нём:
file = open(‘C:\Users\Dushenko\Desktop\test.txt’, ‘r’) print(*file) print(file) file.close() # Вывод: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Закрытие файла
Метод close
Когда файл открывается, он начинает потреблять дополнительные ресурсы, поэтому, после выполнения всех операций, его необходимо закрыть.
Python сам закроет файл, если присвоить объект другому файлу.
Так же можно использовать метод close().
file = open(‘C:\Users\Dushenko\Desktop\test.txt’, ‘r’) # открыть файл из любого каталога print(*file) file.close()
Инструкция with
В Питоне есть более удобный инструмент взаимодействия с файлами, чем те, которые использовались до этого — конструкция with. Кроме того, конструкция with гарантирует закрытие файла автоматически.
Конструкция with называется менеджер контекста.
Обратите внимание, насколько это интуитивно понятно. Оператор Python with всегда будет закрывать файл в конце, даже если программа завершилась ненормально даже в контексте или блоке. Эта функция безопасности рекомендуемый выбор для всех программистов.
В таком случае инструкция close не нужна, потому что with автоматически закроет файл.
Пример использование менеджера контекста:
Источник: pythoninfo.ru
Основы работы с файлами в Python
В этой статье вы узнаете как организовать работать с файлами в Python 3.
Создайте файл files.py и копируйте туда код из примеров.
Запустить файл можно командой
Создать
Создать файл можно командой open
rb чтение в бинарном режиме
rt чтение в текстовом режиме
w только запись.
wb запись в бинарном режиме
wt запись в текстовом режиме
w+ запись и чтение
a запись в конец файла — сохранит данные, которые были в файле
b — это селектор бинарного режима
t — это селектор текстового режима
Любая опция с w перезапишет существующий файл — будьте внимательны!
f = open («log.txt»,»w+»)
Кодировка
import sys print (sys.getdefaultencoding())
Открыть файл
open ( path_to_file , mode , encoding )
По умолчанию используется кодировка utf-8
Чтобы открыть файл для чтения выполните
f = open («log.txt»,»r»)
Если файл log.txt не существует, он не будет создан
raceback (most recent call last): File «files.py», line 1, in f = open(‘log.txt’, ‘r’) FileNotFoundError: [Errno 2] No such file or directory: ‘log.txt’
Закрыть файл
Чтобы закрыть файл выполните
Менеджер контекста
Предпочтительнее использовать менеджер контекста для работы с файлами
Как только вы выйдете из блока в котором открыт файл — он автоматически закроется
with open (‘text.txt’, ‘r’) as f: pass print (f.closed)
С помощью функции type() легко убедиться, что объект, который получается в результате использования with имеет тип _io.TextIOWrapper
Для полноты картины, изучим доступные методы и атрибуты, с помощью dir()
with open (‘text.txt’, ‘r’) as f: print ( type (f)) print ( dir (f))
[‘_CHUNK_SIZE’, ‘__class__’, ‘__del__’, ‘__delattr__’, ‘__dict__’, ‘__dir__’, ‘__doc__’, ‘__enter__’, ‘__eq__’, ‘__exit__’, ‘__format__’, ‘__ge__’, ‘__getattribute__’, ‘__getstate__’, ‘__gt__’, ‘__hash__’, ‘__init__’, ‘__init_subclass__’, ‘__iter__’, ‘__le__’, ‘__lt__’, ‘__ne__’, ‘__new__’, ‘__next__’ , ‘__reduce__’, ‘__reduce_ex__’, ‘__repr__’, ‘__setattr__’, ‘__sizeof__’, ‘__str__’, ‘__subclasshook__’, ‘_checkClosed’, ‘_checkReadable’, ‘_checkSeekable’, ‘_checkWritable’, ‘_finalizing’, ‘buffer’, ‘close’, ‘closed’, ‘detach’, ‘encoding’, ‘errors’, ‘fileno’, ‘flush’, ‘isatty’, ‘line_buffering’, ‘mode’, ‘name’, ‘newlines’, ‘read’, ‘readable’, ‘readline’, ‘readlines’, ‘reconfigure’, ‘seek’, ‘seekable’, ‘tell’, ‘truncate’, ‘writable’, ‘write’, ‘write_through’, ‘writelines’]
Так как у объекта есть метод next() по нему удобно итерировать.
with open (‘text.txt’, ‘r’) as f: print ( next (f)) print ( next (f)) print ( next (f)) print ( next (f))
topbicycle.ru heihei.ru eth1.ru Traceback (most recent call last): File «/mnt/c/Users/Andrei/open_ex.py», line 5, in print(next(f)) ^^^^^^^ StopIteration
Будем рассматривать примеры работы с файлами как с использованием менеджера контекста так и без него.
read(): чтение файла
Получать данные из файла можно с помощью read()
В неё можно передавать аргумент типа int и тогда будет возвращено соответсвующее количество байт содераждания файла.
Прочитать содержимое файла
with open (‘sites.md’, ‘r’) as f: f_contents = f.read() print (f_contents)
www.urn.su www.heihei.ru www.topbicycle.ru
Рассмотрим файл sites.md который состоит из одной строки
>>> f = open(‘sites.md’, mode=’rt’, encoding=’utf-8′) >>> f.read(3)
Чтобы получить всё что осталось в файл нужно вызвать read() без аргументов.
Если вызвать read() ещё раз, вернётся пустая строка
В данный момент указатель стоит на конце файла, но его можно переместить с помощью seek()
Прочитать определённое количество символов
with open (‘sites.md’, ‘r’) as f: f_contents = f.read(20) print (f_contents)
Если выполнять эту команду последовательно — будут прочитаны следующие символы
with open (‘sites.md’, ‘r’) as f: f_contents = f.read(20) print (f_contents, end = ») f_contents = f.read(20) print (f_contents, end = »)
www.urn.su www.heihei.ru www.topbicycle.
Цикл для произвольного количества символов .read
with open (‘sites.md’, ‘r’) as f: size_to_read = 10 f_contents = f.read(size_to_read) while len(f_contents) > 0: print (f_contents, end = ») f_contents = f.read(size_to_read)
www.urn.su www.heihei.ru www.topbicycle.ru
Выражение f_contents = f.read(size_to_read) нужно для того, чтобы когда файл закончится и f.read(size_to_read) станет нулем len(f_contents) тоже станет нулем и цикл завершится
Очистить файл
>>> f = open(‘sites.md’, mode=’w’, encoding=’utf-8′) >>> f.write(»)
readline(): построчное чтение
Метод readline() выводит содержимое построчно.
А метод readlines() выводит все строки в виде списка
Рассмотрим файл sites.md который состоит из трёх строк
>>> f = open(‘sites.md’, mode=’rt’, encoding=’utf-8′) >>> f.readline()
Когда строки закончатся readline() будет возвращать не ошибку, а просто пустую строку
Если нужно снова читать сначала пригодится метод seek() про которой можно прочитать в статье «Дополнительные приёмы работы с файлами»
Строки по одной с помощью readline() в скрипте
with open (‘sites.md’, ‘r’) as f: f_contents = f.readline() print (f_contents) f_contents = f.readline() print (f_contents)
Убрать переходы на новую строку можно с помощью end=»
with open (‘sites.md’, ‘r’) as f: f_contents = f.readline() print (f_contents, end = ») f_contents = f.readline() print (f_contents, end = »)
Цикл для построчного вывода без использования readline()
with open (‘sites.md’, ‘r’) as f: for line in f: print (line, end = »)
www.urn.su www.heihei.ru www.topbicycle.ru
В качестве альтернативы можно использовать sys.stdout.write()
Про передачу аргументов из терминала вы можете прочитать в статье sys.argv[]
# files.py import sys f = open (sys.argv[ 1 ], mode= ‘rt’ , encoding= ‘utf-8’ ) for line in f: sys.stdout.write(line) f.close()
python files.py sites.md
www.urn.su www.heihei.ru www.topbicycle.ru
readlines()
Метод readlines() выводит все строки в виде списка
[‘www.topbicycle.run’, ‘www.heihei.run’, ‘eth1.ru’]
Все строки с символом перехода на новую строку — readlines
with open (‘sites.md’, ‘r’) as f: f_contents = f.readlines() print (f_contents)
[‘www.urn.sun’, ‘www.heihei.run’, ‘www.topbicycle.run’]
Имя файла
Пример программы, которая выводит на экран имя файла и режим, в котором он открыт
f = open (‘log.txt’, ‘r’) print (f.name) print (f.mode) f.close()
Если файл log.txt существует, то в терминале вы увидите
Копирование файлов
Текстовые файлы
Их можно копировать построчно
with open (‘sites.md’, ‘r’) as rf: with open (‘sites_copy.txt’, ‘w’) as wf: for line in rf: wf.write(line)
www.urn.su www.heihei.ru www.topbicycle.ru
Изображения
Их тоже можно копировать построчно, но открывать и записывать нужно в побитовом режиме. То есть нужно добавлять опцию b
Скачайте изображение велосипеда с сайта TopBicycle.ru или возьмите любую другую картинку
wget https://topbicycle.ru/b/img/stels_pilot_950_MD_26.jpg
ls
with open (‘stels_pilot_950_MD_26.jpg’, ‘rb’) as rf: with open (‘stels_pilot_950_MD_26_copy.jpg’, ‘wb’) as wf: for line in rf: wf.write(line)
python3 files.py
ls
Более правильным подходом считается копирование не в построчном режиме а частями с фиксированным размером
with open (‘stels_pilot_950_MD_26.jpg’, ‘rb’) as rf: with open (‘stels_pilot_950_MD_26_copy.jpg’, ‘wb’) as wf: chunk_size = 4096 rf_chunk = rf.read(chunk_size) while len(rf_chunk) > 0: wf.write(rf_chunk) rf_chunk = rf.read(chunk_size)
Записать файл
Чтобы очистить файл от старого содержимого и записать в него новое используется опция w (write)
with open (‘log.txt’, ‘w’) as f: f.write(«some text»)
>>> f = open(‘sites.md’, ‘w’) >>> f.write(«topbicycle.ru»)
13 и 9 это число байт переданное в файл
>>> f.close() >>> exit() cat sites.md
cat sites.md www.topbicycle.ru www.heihei.ru eth1.ruwww.aviasales.ru www.booking.comwww.tutu.ru www.velodrive.ruwww.velosklad.ru%
-rw-r—r— 1 andrei users 23 Jun 25 10:34 sites.md
Конечный размер файла будет зависеть от опецарионной системы.
В Windows и Linux разные переносы строк, поэтому когда Python применяет свой универсальный перенос строки количество байт может увеличится на 1 а может остаться прежним.
write() возвращает количество байт, переданных в файл, а не фактический размер записанных данных.
Дописать в файл
Если нужно добавить новые данные к предыдущему содержимому без удаления — используется опция a (append)
with open (‘log.txt’, ‘a’) as f: f.write(«some text»)
Рассмотрим пример добавления данных в файл sites.md с помощью метода writelines()
www.topbicycle.ru www.heihei.ru www.eth1.ru
www.topbicycle.ru www.heihei.ru eth1.ruwww.aviasales.ru www.booking.comwww.tutu.ru www.velodrive.ruwww.velosklad.ru
Видно, что переносы строк появились только там, где из указали вручную.
Если нужно добавить данные не в конец файла, а в определённое место — изучите пример в статье «Продвинутые приёмы работы с файлами»
Источник: www.andreyolegovich.ru