Какие функции нужны для работы с файлами в Python?
open() — принимает имя файла в виде строки и открывает файл по умолчанию для чтения. Если нужно открыть для записи, то вторым аргументом нужно добавить ‘w’ .
close() — закрывает открытый файл. Но безопаснее использовать контекстный менеджер с инструкцией with !
file.write() — записывает данные в файл.
file.read() — читает данные из файла.
path.rename(target) — метод из библиотеки pathlib, который переименовывает файл иди директорию, расположенную по path (путь до файла), в target.
remove(path) — функция из модуля os, которая удаляет файл, расположенные по path (путь до файла).
Как работать с файлами в Python

Программа на Python — это не только функционал, но и оптимальная система работы с файлами. Например, если вы пишете чат-бот, вам нужно загрузить в него готовые ответы в файле txt. Если вы сделали программу для обработки фото — здесь ваш код на Python должен быть готов обрабатывать файлы, которые загрузит в сервис пользователь. В этой статье разберемся, как работать с файлами на Python, какие для этого есть библиотеки и методы.

Освойте профессию
«Python-разработчик»
Что такое файл
На любом компьютере и в любой операционной системе есть файлы — область данных со своим именем, хранящаяся на носителе. Их принято считать базовыми объектами, из которых складываются директории. В Python с помощью файлов можно сохранять результат работы программы или получать из них данные для обработки в коде.
Python-разработчик
Освойте Python, самый популярный язык программирования
3 383 ₽/мес 6 150 ₽/мес

- открытие;
- операции чтения из файла и записи в файл;
- закрытие.
Разберемся со всеми действиями по порядку.
Открытие файла на чтение и запись в Python
На компьютере файл надо открыть перед тем, как вносить в него изменения. Такое же правила действует и для Python: нужно открыть файл на чтение и запись. Без этапа открытия нельзя читать содержимое или изменять его. Открыть файл можно с помощью функции open() :
open(file, mode='rt')
В функцию в качестве аргументов требуется передать путь файлу (file) и выбрать режим работы (mode). По умолчанию Python выбирает значение rt , но доступны и другие режимы:
Аргумент mode
Как работает
Чтение из файла
Открыть как текстовый файл
Запись в файл и создание файла, если его не существует
Запись в файл и вызовы исключения, если файла не существует
Открыть как двоичный файл
Запись в файл путем добавления новых значений в конец
Работа в режиме чтения и записи
Можно комбинировать режимы и использовать сразу несколько. К примеру, по умолчанию функция open() принимает аргумент rt . Это значит, что файл будет открыт в виде текстового документа для чтения. С помощью r+ и w+ можно открыть файл сразу для чтения и записи на Python. В первом случае несуществующие файлы будут создаваться, а во втором такое действие спровоцирует вызов исключения.
Если в Python надо открыть файл data.txt в виде текстового документа с правами для чтения, то для этого следует использовать следующий код:
f = open('data.txt')
При этом Python установит режим открытия файла по умолчанию. Если нужен другой режим, то следует передать в функцию аргументы mode:
f = open('data.txt', 'w+')
После окончания работы файлы надо закрывать — так же, как мы это делаем на компьютере. Для этого используется функция close() после кода взаимодействия с файлом:
f = open('data.txt', 'w+') # действия с файлом f.close()
Также файлы можно открывать с помощью менеджера контекста with . В этом случае файл автоматически закроется, когда работа с ним завершится:
with open('data.txt', 'w+') as f: # действия с файлом
При открытии файла можно дополнительно указать кодировку, если нужна специфическая или требуется больше контроля над работой кода:
with open('data.txt', 'w+', encoding='utf-8') as f: # действия с файлом
Кодировку можно указать третьим параметром и при обычном способе открытия:
f = open('data.txt', 'w+', encoding='utf-8') # действия с файлом f.close()
Чтение файла
Чтение из файла Python можно реализовать с помощью функции read(), если он открыт в режиме чтения r . Синтаксис функции выглядит следующим образом:
file.read(size)
В строке выше file обозначает объект, с которым работаем, а size — количество символов для чтения. Если ничего не указать в качестве аргумента функции read() , то получится прочитать сразу все содержимое документа.
Для примера: создадим в проекте file.txt и запишем в него строку «Привет, Python!». Теперь прочитаем первые шесть символов из файла:
with open('file.txt', 'r', encoding='utf-8') as f: data = f.read(6) print(data)
Если запустить код, то Python выведет в консоль фразу «Привет» — это и есть первые шесть символов строки «Привет, Python!» в file.txt:
>>> Привет
Теперь отредактируем код. В этом примере не будем передавать никакие аргументы в функцию read() :
with open('file.txt', 'r', encoding='utf-8') as f: data = f.read() print(data) >>> Привет, Python!
В этом случае система выводит сразу все содержимое файла.
Содержимое файла можно считывать построчно. Убедимся в этом, отредактировав file.txt. Добавим в него список продуктов:
Морковь Сметана Мука Яблоки
Теперь прочитаем этот список с помощью функции readline() :
with open('file.txt', 'r', encoding='utf-8') as f: print(f.readline()) >>> Морковь
Python прочитал первую строку списка продуктов. Если вызвать функцию readline() несколько раз, то получится прочитать последующие строки файла:
with open('file.txt', 'r', encoding='utf-8') as f: print(f.readline()) print(f.readline()) print(f.readline()) print(f.readline()) >>> Морковь >>> Сметана >>> Мука >>> Яблоки
Более удобно последовательное чтение с помощью readline() можно реализовать в цикле:
with open('file.txt', 'r', encoding='utf-8') as f: for line in f: print(line) >>> Морковь >>> Сметана >>> Мука >>> Яблоки
Все строки файла можно прочитать с помощью метода readlines() , возвращающего содержимое в виде списка вместе со специальными символами:
with open('file.txt', 'r', encoding='utf-8') as f: data = f.readlines() print(data) >>> ['Морковь\n', 'Сметана\n', 'Мука\n', 'Яблоки']
Такое чтение можно реализовать и без метода readlines() , воспользовавшись конструктором списков list() :
with open('file.txt', 'r', encoding='utf-8') as f: data = list(f) print(data) >>> ['Морковь\n', 'Сметана\n', 'Мука\n', 'Яблоки']
При чтении всего файла в Python стоит помнить, что он может быть слишком большим. Если разместить его полностью в оперативной памяти компьютера не получается, следует считывать его частями.
Запись в файл на Python
Для записи файла в Python используется функция write() . В качестве аргумента ей следует передать строку, содержимое которой будет записано:
file.write(string)
Удалим все содержимое file.txt и запишем в него строку «Привет, Python!»:
with open('file.txt', 'a', encoding='utf-8') as f: data = 'Привет, Python!' f.write(data)
Обратите внимание, что в этом примере мы открыли файл в режиме a, что позволяет записывать новые строки в конец. Выполняем код, открываем файл — теперь в нем содержится строка «Привет, Python!».
В файл можно записать сразу список строк. Для этого применяется метод writelines() , которому в качестве аргумента надо передать сам список. В качестве примера создадим переменную со списком продуктов и запишем ее в file.txt:
with open('file.txt', 'a', encoding='utf-8') as f: grocery = ['Морковь', 'Яблоки', 'Мука', 'Молоко'] f.writelines(grocery)
Если выполнить код и проверить file.txt, то мы увидим единую строку без пробелов. Все дело в том, что метод writelines() не добавляет разделители строк автоматически. Нужно сделать это вручную, прописав \n каждому элементу списка:
with open('file.txt', 'a', encoding='utf-8') as f: grocery = ['Морковь\n', 'Яблоки\n', 'Мука\n', 'Молоко\n'] f.writelines(grocery)
Теперь при выполнении кода каждый элемент списка будет записываться на новую строку.

Станьте разработчиком на Python и решайте самые разные задачи: от написания кода до автоматизации процессов
Управление указателем
В Python есть возможность явно задать позицию указателя в файле — для этого используется метод seek(). Узнать текущую позицию можно с помощью метода tell() .
Рассмотрим принципы работы с методами на примере. Откроем file.txt в режиме доступа r+ и запишем в него строку «0123456789ABCDEF»:
with open('file.txt', 'r+', encoding='utf-8') as f: f.write('0123456789ABCDEF')
Теперь прочитаем седьмой символ в строке. Для этого воспользуемся методом seek() для перемещения указателя. В качестве аргумента надо передать функции аргумент смещения в байтах. Вспомним, что нумерация строк начинается с нуля, а нам надо прочитать седьмой символ строки. Значит, укажем смещение в шесть байтов:
with open('file.txt', 'r+', encoding='utf-8') as f: f.write('123456789ABCDEF') f.seek(5) data = f.read(1) print(data) >>> 6
Можно осуществить смещение с конца, тогда в качестве второго элемента надо передать отправную точку для формирования смещения. Всего доступны три начальные позиции:
- 0 — от начала файла;
- 1 — от текущей позиции;
- 2 — от конца файла.
Теперь прочитаем четвертый символ с конца строки:
with open('file.txt', 'r+b') as f: f.seek(-4, 2) data = f.read(1) print(data) >>> b'C'
Узнать байт позиции указателя можно с помощью метода tell() :
with open('file.txt', 'r+', encoding='utf-8') as f: f.write('123456789ABCDEF') f.read(5) print(f.tell())
Работа с файловой системой
В Python можно работать не только с конкретным файлом, но и со всей системой. Перемещаться между каталогами, создавать новые файлы и переименовывать существующие.
Для работы с файловой системой на Python используют встроенная библиотека OS. Ее необходимо отдельно импортировать в код проекта, чтобы получить доступа к ее методам:
import os
Теперь узнаем с помощью Python текущий каталог. Делаем это с помощью метода getcwd() . В выводе метода получим путь к папке, в которой сейчас находимся:
import os print(os.getcwd()) >>> /Users/daniilshat/PycharmProjects/pythonProject
С помощью метода listdir() можно получить список с содержимым каталога. В качестве аргумента можно передать путь к директории; если этого не сделать, то система покажет содержимое текущего каталога:
import os # содержимое текущего каталога print(os.listdir()) # содержимое директории PycharmProjects print(os.listdir('/Users/daniilshat/PycharmProjects')) >>> ['file.txt', 'main.py', '.idea'] >>> ['.DS_Store', 'pythonProject', 'bot', 'love-couples']
Для создания новых директорий файлов в Python используют метод mkdir() . В качестве аргумента ему надо передать полный путь, включая название новой директории. Для примера создадим директорию Example в PycharmProjects:
import os # содержимое директории PycharmProjects до создания print(os.listdir('/Users/daniilshat/PycharmProjects')) os.mkdir('/Users/daniilshat/PycharmProjects/Example') # содержимое директории PycharmProjects после создания print(os.listdir('/Users/daniilshat/PycharmProjects')) >>> ['.DS_Store', 'pythonProject', 'bot', 'love-couples'] >>> ['.DS_Store', 'pythonProject', 'Example', 'bot', 'love-couples']
С помощью Python можно переименовывать файлы и директории. Для этого используется метода rename() , которому необходимо передать в качестве аргументов путь к старому и новым файлам. Переименуем директорию Example в New Example:
import os dir = '/Users/daniilshat/PycharmProjects' old_file = os.path.join(dir, 'Example') new_file = os.path.join(dir, 'New Example') # содержимое директории PycharmProjects до переименования print(os.listdir(dir)) os.rename(old_file, new_file) # содержимое директории PycharmProjects после переименования создания print(os.listdir(dir)) >>> ['.DS_Store', 'pythonProject', 'Example', 'bot', 'love-couples'] >>> ['.DS_Store', 'pythonProject', 'bot', 'New Example', 'love-couples']
Для удаления пустых директорий файлов в Python можно использовать метод rmdir() , а для удаления директории со всем содержимым — shutil.rmtree() . В качестве аргумента требуется передать путь к директории. Для примера удалим директорию New Example, которую недавно создали:
import os # содержимое директории PycharmProjects до удаления print(os.listdir('/Users/daniilshat/PycharmProjects')) os.rmdir('/Users/daniilshat/PycharmProjects/New Example') # содержимое директории PycharmProjects после удаления print(os.listdir('/Users/daniilshat/PycharmProjects')) >>> ['.DS_Store', 'pythonProject', 'bot', 'New Example', 'love-couples'] >>> ['.DS_Store', 'pythonProject', 'bot', 'love-couples']
Итог
В Python можно работать с файлами и получать доступ к файловой системе для изменения каталогов и директорий. Все это можно делать с помощью кода. В Python для этого предусмотрены следующие методы.
| Метод | Что делает |
| os.getcwd() | Узнать текущий каталог |
| os.listdir(path) | Узнать список содержимого каталога |
| os.mkdir(path) | Создать директорию |
| os.rename(old_file, new_file) | Переименовать файл или директорию |
| os.rmdir(path) | Удалить пустую директорию |
| shutil.rmtree(path) | Удалить директорию со всем содержимым |
| file.read(size) | Прочитать определенное количество символов из файла |
| file.readline() | Прочитать строку из файла |
| file.readlines() | Прочитать все строки из файла |
| file.write(string) | Записать строку в файл |
| file.writelines(list) | Записать список строк в файл |
| file.seek(int) | Переместить указатель |
| file.tell() | Узнать текущее положение указателя |
Python-разработчик
Освойте Python с нуля. Подготовим к трудоустройству: дадим много практики, реальные проекты для портфолио, поможем с резюме. Лучшие студенты пройдут стажировки в проектах компаний-партнеров.
Не записывает в файл .txt но ошибок нет
Почему то, спустя два года он перестал работать. Ошибок не выдает, но и не записывает ничего в .txt. Подскажите, что не так?
Отслеживать
51.6k 201 201 золотой знак 65 65 серебряных знаков 246 246 бронзовых знаков
задан 22 апр 2020 в 10:34
386 1 1 серебряный знак 13 13 бронзовых знаков
У меня всё работает на Python 3.8 .
22 апр 2020 в 10:37
А у меня почему-то не хочет после двух лет работы ): Python 3.6.4
22 апр 2020 в 10:43
@Denzel, а вы файл закрыли после записи? PS безопаснее использовать context manager — with open(. ) as f: json.dum(js1, f)
22 апр 2020 в 10:51
@MaxU Нет, не закрывал. Ваш способ тоже не записывает.
22 апр 2020 в 10:59
попробуйте прочитать записанный файл при помощи Python скрипта — похоже файл записывается, но не в ту директорию, где вы его ожидаете
22 апр 2020 в 11:01
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
- Во-первых укажите полный путь к файлу дабы избежать сюрпризов (файл может записываться не в ту директорию, где вы его ожидаете увидеть):
filename = r"c:\temp\Paper.txt"
при работе с неполными путями убедитесь, что интерпретатор запускается / работает в нужной директории:
print(os.path.abspath(os.curdir)) # показать текущую директорию os.chdir(r"c:\some\target\directory") # сменить текущую директорию
- Во-вторых используйте контекстный менеджер при работе с файлами — он сам позаботится о своевременном закрытии файла:
with open(filename, "w") as f: json.dump(js1, f)
Пожалуйста, не используйте Python для инструментария
Разработчики любят спорить о языках программирования и инструментах. Если опустить типичные претензии, обычно все сводится к тому, что люди просто защищают свой выбор. Это проявление тенденции оправдывать и защищать свои инвестиции — время потраченное на изучение используемых языка и инструментов. И в этом есть смысл. Но не всегда это поведение является рациональным.
Эта запись, в основном, посвящена инструментам для таких платформ, как Zephyr (west) и ESP-IDF (idf.py). Но большинство замечаний справедливы и для многих других одноразовых и специальных инструментов.
Вложенные инвестиции
В отличие от того что нам порой говорят или продают, для уверенного владения языком программирования требуются годы. Обычно мне требуется 3-4 года применения языка программирования, прежде чем смогу сказать, что я знаю этот язык. Некоторым людям, вероятно, нужно меньше времени чтобы достичь того же уровня. Как бы то ни было, изучение языка программирования требует значительных затрат вашего личного времени.
И поскольку изучение языка программирования это затратно, весьма ожидаемо, что люди подсознательно стремятся защитить свой выбор. Если вы потратили 4-5 лет на язык X, потребуется немало времени чтобы убедить вас переключиться на язык Y. В такой ситуации легко стать жертвой заблуждения — соглашаясь, обесцениваю свои инвестиции.
Модные языки
Сегодня многие люди изучают Python. Python очень моден и часто можно услышать, что если вы изучите Python, вам будет легко найти работу. Вероятно, так оно и есть. Python предлагает низкий порог входа, богатый набор достойных библиотек для всего, от веб-программирования до машинного обучения, и не строгий язык, который позволит вам расслабиться и не задумываться о типах перемнных и многом другом. Или, если быть более точным: Python — язык, который позволяет вам быть чуть неряшливым.
Два с половиной десятилетия назад существовал язык, игравший аналогичную роль. Perl был Python своего времени. Какое-то время, большая часть интернет-индустрии работала на Perl. Для многих, Perl был предпочитаемым языком для веб-программирования и системного администрирования. Вы бы встретили много программистов Perl в таких местах, как финансовый сектор или развед. службы. Места, где у людей было много данных для обработки и анализа.
Если не обращать внимание на косметические различия, Perl мало чем отличался от Python с точки зрения практики разработки программного обеспечения. Он позволял быстро писать неряшливый код, и у него было масса плюсов для быстрого создания решений.
Perl и Python имеют одни и те же проблемы. Наиболее очевидным является то, что ни один из них не является компилируемым языком и не имеет статической типизации. Это не имеет большого значения, когда вы быстро склеиваете прототип, но становится серьезной проблемой, когда проект начинает расти в сложности, охватываемая аудитория увеличивается и люди начинают зависеть от вашего кода. Поддержка кода без помощи компилятора и отсутствие простого способа распространения программного решения имеют высокую цену при растущих масштабах.
Конечно, вы можете попытаться компенсировать это, написав тесты которые попытаются покрыть то, что вам дали бы статическая типизация и компилятор, но это скорее принятие желаемого за действительное. Признайтесь: вы не будете настолько скрупулезны. В противном случае, вероятно, вы бы изначально не стали использовать динамический язык.
Антисоциальное поведение
Этот параграф может спровоцировать разработчиков на Python, но Python — антисоциальный язык. Он фокусируется в первую очередь на потребностях разработчика, а не на пользователях программного обеспечения. Это, не очень красиво.. и если честно, то даже весьма высокомерно.
Вполне нормально чувствовать несогласие с подобными высказываниями. Как указывалось ранее: вы, вероятно, потратили много времени на Python. Вы будете склонны оправдывать и защищать вложенные инвестиции. Призываю вас обдумать написанное и постараться подавить немедленное желание выразить несогласие. Постарайтесь взглянуть на это с другой стороны — ведь именно так многие пользователи воспринимают программное обеспечение написанное на Python.
Итак, что же я имею в виду, когда говорю, что Python антисоциален?
Если вы используете язык, который может выдавать бинарные файлы, задача по установке всех зависимостей с правильными версиями является одноразовой: это происходит во время сборки. Это не происходит каждый раз при запуске программы. Более того: этот процесс можно автоматизировать, чтобы результат можно было распространять. Вы можете создать статически связанный бинарный файл, который просто нужно скачать и поместить в соответствующее место.
Это должно быть задачей разработчиков программного обеспечения, а не пользователей.
Каждый раз, когда вы запускаете программу на Python, все зависимости должны присутствовать. Если один из пакетов внезапно пропал, был обновлен или требуемая версия Python недоступна, ваша программа скорее всего не запустится. А что еще хуже, это может привести к неочевидным, на первый взгляд, последствиям и не очень внятным ошибкам.
Это случается нередко. На самом деле, каждый год мы теряем недели разработки из-за того, что программы на Python внезапно перестают работать. Каждое обновление в цепочке зависимостей любых из используемых нами инструментов, сопряжено со значительными рисками сломать нашу среду сборки. Нам приходится тратить время на починку нашего инструментария, прежде чем мы сможем вернуться к основным задачам. Если честно, все настолько плохо, что если я склонирую встраиваемый код через несколько недель после того как это было закоммичено, и попытаюсь собрать, вероятность того, что не соберется — примерно 50/50.
Многие встроенные зависимости неприемлемо хрупкие. Если вы профессиональный инженер-программист и вас это не беспокоит, вам, вероятно, следует пересмотреть свои стандарты качества. Воспроизводимость и повторяемость имеют огромное значение. Особенно, если вы считаете себя профессионалом.
Переосмысление инструментов
Понятно, что люди не особенно склонны отказываться от своего привычного языка программирования и не стремятся переписывать программное обеспечение, которое работает. Вы вложились в изучение языка, а затем в создание инструментов или приложений на этом языке. Это представляет собой инвестиции и часто значительные, невозвратные затраты. Начинать сначала, может показаться не очень привлекательным решением.
Но вам стоит рассмотреть этот вариант серьезней. Как вы хотите проводить время в долгосрочной перспективе? Хотите решать проблемы, возникшие из-за выбора Python? Выяснять, как заставить приложения на Python работать предсказуемо, надежно и без необходимости постоянных действий со стороны пользователя? Или все таки сосредоточиться на создании продукта?
Если вы используете Python сегодня, я думаю, что вы просто обязаны попробовать сделать несколько небольших проектов на языках, более подходящих для создания простых инструментов, которые работают независимо от того, как настроена ваша система. Начните с выбора современного компилируемого языка. Два отличных кандидата — Rust и Go. Но подойдет любой язык, который имеет статическую типизацию, достойную стандартную библиотеку и компилируется в (предпочтительно статически связанные) бинарные файлы.
В крайнем случае, даже Java представляет лучшую альтернативу, поскольку у вас есть возможность создавать файлы «jar», содержащие все зависимости. Не модный, но объективно куда менее хрупкий вариант.
Перепишите небольшое приложение или утилиту на один из таких языков. Возможно, придется сделать это пару раз: сначала просто повторить функционал, а затем посмотреть, есть ли более идиоматические способы структурирования кода. Основная цель – научиться создавать более качественные приложения и тулинг.
Когда вы начнете чувствовать себя более комфортно с любым языком, который вы выберете, начните думать о том, как вы можете создавать кодовые базы «двойного назначения»: постарайтесь структурировать любой код, который вы пишете, в виде библиотеки, которую можно использовать для создания новых инструментов, включающих эту функциональность. Попробуйте подумать о том, как вы можете повысить продуктивность других. (Если вы ищете возможности роста как программист, это именно то, как это достигается: начните помогать другим разработчикам своим вкладом).
Заключительные мысли
Иметь сочувствие к своим пользователям — важно. Написание кода может быть очень эгоцентричным занятием, когда легко сосредоточиться только на своих собственных потребностях. Если другим людям сложно использовать ваши программы, то это ваша вина. Не говорите им, что они используют его неправильно. Не тратьте время на выдумывание причудливых способов справиться с вашим ненадежным кодом. Не ждите, что они спокойно воспримут, то что вы не хотите упрощать им жизнь.
И вы можете быть совершенно эгоистичным в том что: если вы создадите что-то, что сделает ваших пользователей счастливее, это хорошо отразится и на вас.
Я понимаю, что просить людей не использовать Python — это провокация. Но я говорю это не назло или чтобы кого-то обидеть. Я говорю это, потому что потратил слишком много недель на то, чтобы заставить плохо продуманные инструменты работать, я не увидел значительных улучшений за последние годы, и я думаю, что пришло время начать относиться к этому немного серьезней.
- python
- programming languages
- программирование
- перевод