Python | Работа с файлами

Последнее обновление: 29.04.2017

Python поддерживает множество различных типов файлов, но условно их можно разделить на два виде: текстовые и бинарные. Текстовые файлы — это к примеру файлы с расширением cvs, txt, html, в общем любые файлы, которые сохраняют информацию в текстовом виде. Бинарные файлы — это изображения, аудио и видеофайлы и т.д. В зависимости от типа файла работа с ним может немного отличаться.

При работе с файлами необходимо соблюдать некоторую последовательность операций:

  1. Открытие файла с помощью метода open()

  2. Чтение файла с помощью метода read() или запись в файл посредством метода write()

  3. Закрытие файла методом close()

Открытие и закрытие файла

Чтобы начать работу с файлом, его надо открыть с помощью функции open(), которая имеет следующее формальное определение:

open(file, mode)

Первый параметр функции представляет путь к файлу.

Путь файла может быть абсолютным, то есть начинаться с буквы диска, например, C://somedir/somefile.txt. Либо можно быть относительным, например, somedir/somefile.txt — в этом случае поиск файла будет идти относительно расположения запущенного скрипта 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")

НазадСодержаниеВперед

Python 3: файлы — чтение и запись: open, read, write, seek, readline, dump, load, pickle

Смотреть материал на видео

На этом занятии мы поговорим, как в Python можно считывать информацию из файлов и записывать ее в файлы. Что такое файлы и зачем они нужны, думаю объяснять не надо, т. к. если вы дошли до этого занятия, значит, проблем с пониманием таких базовых вещей у вас нет. Поэтому сразу перейдем к функции

open(file [, mode=’r’, encoding=None, …])

через которую и осуществляется работа с файлами. Здесь

  • file – это путь к файлу вместе с его именем;
  • mode – режим доступа к файлу;
  • encoding – кодировка файла.

Для начала определимся с понятием «путь к файлу». Представим, что наш файл ex1.py находится в каталоге app:

Тогда, чтобы обратиться к файлу my_file.txt путь можно записать так:

«my_file.txt»

или

«d:\\app\\my_file.txt»

или так:

«d:/app/my_file.txt»

Последние два варианта представляют собой абсолютный путь к файлу, то есть, полный путь, начиная с указания диска. Причем, обычно используют обратный слеш в качестве разделителя: так короче писать и такой путь будет корректно восприниматься как под ОС Windows, так и Linux. Первый же вариант – это относительный путь, относительно рабочего каталога.

Теперь, предположим, мы хотим обратиться к файлу img.txt. Это можно сделать так:

«images/img.txt»

или так:

«d:/app/images/img.txt»

Для доступа к out.txt пути будут записаны так:

«../out.txt»

«d:/out.txt»

Обратите внимание, здесь две точки означают переход к родительскому каталогу, то есть, выход из каталога app на один уровень вверх.

И, наконец, для доступа к файлу prt.dat пути запишутся так:

«../parent/prt.dat»

«d:/ parent/prt.dat»

Вот так следует прописывать пути к файлам. В нашем случае мы имеем текстовый файл «myfile. txt», который находится в том же каталоге, что и программа ex1.py, поэтому путь можно записать просто указав имя файла:

file = open("myfile.txt")

В результате переменная file будет ссылаться на файловый объект, через который и происходит работа с файлами. Если указать неверный путь, например, так:

file = open("myfile2.txt")

то возникнет ошибка FileNotFoundError. Это стандартное исключение и как их обрабатывать мы с вами говорили на предыдущем занятии. Поэтому, запишем этот критический код в блоке try:

try:
    file = open("myfile2.txt")
except FileNotFoundError:
    print("Невозможно открыть файл")

Изменим имя файла на верное и посмотрим, как далее можно с ним работать. По умолчанию функция open открывает файл в текстовом режиме на чтение. Это режим

mode = «r»

Если нам нужно поменять режим доступа к файлу, например, открыть его на запись, то это явно указывается вторым параметром функции open:

file = open("out. txt", "w")

В Python имеются следующие режимы доступа:

Название

Описание

‘r’

открытие на чтение (значение по умолчанию)

‘w’

открытие на запись (содержимое файла удаляется, а если его нет, то создается новый)

‘x’

открытие файла на запись, если его нет генерирует исключение

‘a’

открытие на дозапись (информация добавляется в конец файла)

Дополнения

‘b’

открытие в бинарном режиме доступа к информации файла

‘t’

открытие в текстовом режиме доступа (если явно не указывается, то используется по умолчанию)

‘+’

открытие на чтение и запись одновременно

Здесь мы имеем три основных режима доступа: на чтение, запись и добавление.

И еще три возможных расширения этих режимов, например,

  • ‘rt’ – чтение в текстовом режиме;
  • ‘wb’ – запись в бинарном режиме;
  • ‘a+’ – дозапись или чтение данных из файла.

Чтение информации из файла

В чем отличие текстового режима от бинарного мы поговорим позже, а сейчас откроем файл на чтение в текстовом режиме:

file = open("myfile.txt")

и прочитаем его содержимое с помощью метода read:

print( file.read() )

В результате, получим строку, в которой будет находиться прочитанное содержимое. Действительно, в этом файле находятся эти строчки из поэмы Пушкина А.С. «Медный всадник». И здесь есть один тонкий момент. Наш текстовый файл имеет кодировку Windows-1251 и эта кодировка используется по умолчанию в функции read. Но, если изменить кодировку файла, например, на популярную UTF-8, то после запуска программы увидим в консоли вот такую белиберду. Как это можно исправить, не меняя кодировки самого файла? Для этого следует воспользоваться именованным параметром encoding и записать метод open вот так:

file = open("myfile.txt", encoding="utf-8" )

Теперь все будет работать корректно. Далее, в методе read мы можем указать некий числовой аргумент, например,

print( file.read(2) )

Тогда из файла будут считаны первые два символа. И смотрите, если мы запишем два таких вызова подряд:

print( file.read(2) )
print( file.read(2) )

то увидим, что при следующем вызове метод read продолжил читать следующие два символа. Почему так произошло? Дело в том, что у файлового объекта, на который ссылается переменная file, имеется внутренний указатель позиции (file position), который показывает с какого места производить считывание информации.

Когда мы вызываем метод read(2) эта позиция автоматически сдвигается от начала файла на два символа, т. к. мы именно столько считываем. И при повторном вызове read(2) считывание продолжается, т.е. берутся следующие два символа. Соответственно, позиция файла сдвигается дальше. И так, пока не дойдем до конца.

Но мы в Python можем управлять этой файловой позицией с помощью метода

seek(offset[, from_what])

Например, вот такая запись:

file.seek(0)

будет означать, что мы устанавливаем позицию в начало и тогда такие строчки:

print( file.read(2) )
file.seek(0)
print( file.read(2) )

будут считывать одни и те же первые символы. Если же мы хотим узнать текущую позицию в файле, то следует вызвать метод tell:

pos = file.tell()
print( pos )

Следующий полезный метод – это readline позволяет построчно считывать информацию из текстового файла:

s = file.readline()
print( s )

Здесь концом строки считается символ переноса ‘\n’, либо конец файла. Причем, этот символ переноса строки будет также присутствовать в строке. Мы в этом можем убедиться, вызвав дважды эту функцию:

    print( file.readline() )
    print( file.readline() )

Здесь в консоли строчки будут разделены пустой строкой. Это как раз из-за того, что один перенос идет из прочитанной строки, а второй добавляется самой функцией print. Поэтому, если их записать вот так:

    print( file.readline(), end="" )
    print( file.readline(), end="" )

то вывод будет построчным с одним переносом.

Если нам нужно последовательно прочитать все строчки из файла, то для этого обычно используют цикл for следующим образом:

    for line in file:
        print( line, end="" )

Этот пример показывает, что объект файл является итерируемым и на каждой итерации возвращает очередную строку.

Или же, все строчки можно прочитать методом

s = file. readlines()

и тогда переменная s будет ссылаться на упорядоченный список с этими строками:

print( s )

Однако этот метод следует использовать с осторожностью, т.к. для больших файлов может возникнуть ошибка нехватки памяти для хранения полученного списка.

По сути это все методы для считывания информации из файла. И, смотрите, как только мы завершили работу с файлом, его следует закрыть. Для этого используется метод close:

file.close()

Конечно, прописывая эту строчку, мы не увидим никакой разницы в работе программы. Но, во-первых, закрывая файл, мы освобождаем память, связанную с этим файлом и, во-вторых, у нас не будет проблем в потере данных при их записи в файл. А, вообще, лучше просто запомнить: после завершения работы с файлом, его нужно закрыть. Причем, организовать программу лучше так:

try:
    file = open("myfile.txt")
 
    try:
        s = file. readlines()
        print( s )
    finally:
        file.close()
 
except FileNotFoundError:
    print("Невозможно открыть файл")

Мы здесь создаем вложенный блок try, в который помещаем критический текст программы при работе с файлом и далее блок finally, который будет выполнен при любом стечении обстоятельств, а значит, файл гарантированно будет закрыт.

Или же, забегая немного вперед, отмечу, что часто для открытия файла пользуются так называемым менеджером контекста, когда файл открывают при помощи оператора with:

try:
    with open("myfile.txt", "r") as file:      # file = open("myfile.txt")
        s = file.readlines()
        print( s )
 
except FileNotFoundError:
    print("Невозможно открыть файл")

При таком подходе файл закрывается автоматически после выполнения всех инструкций внутри этого менеджера. В этом можно убедиться, выведем в консоль флаг, сигнализирующий закрытие файла:

finally:
    print(file. closed)

Запустим программу, видите, все работает также и при этом файл автоматически закрывается. Даже если произойдет критическая ошибка, например, пропишем такую конструкцию:

print( int(s) )

то, как видим, файл все равно закрывается. Вот в этом удобство такого подхода при работе с файлами.

Запись информации в файл

Теперь давайте посмотрим, как происходит запись информации в файл. Во-первых, нам нужно открыть файл на запись, например, так:

file = open("out.txt", "w")

и далее вызвать метод write:

file.write("Hello World!")

В результате у нас будет создан файл out.txt со строкой «Hello World!». Причем, этот файл будет располагаться в том же каталоге, что и файл с текстом программы на Python.

Далее сделаем такую операцию: запишем метод write следующим образом:

file.write("Hello")

И снова выполним эту программу. Смотрите, в нашем файле out.txt прежнее содержимое исчезло и появилось новое – строка «Hello». То есть, когда мы открываем файл на запись в режимах

w, wt, wb,

то прежнее содержимое файла удаляется. Вот этот момент следует всегда помнить.

Теперь посмотрим, что будет, если вызвать метод write несколько раз подряд:

    file.write("Hello1")
    file.write("Hello2")
    file.write("Hello3")

Смотрите, у нас в файле появились эти строчки друг за другом. То есть, здесь как и со считыванием: объект file записывает информацию, начиная с текущей файловой позиции, и автоматически перемещает ее при выполнении метода write.

Если мы хотим записать эти строчки в файл каждую с новой строки, то в конце каждой пропишем символ переноса строки:

   file.write("Hello1\n")
   file.write("Hello2\n")
   file.write("Hello3\n")

Далее, для дозаписи информации в файл, то есть, записи с сохранением предыдущего содержимого, файл следует открыть в режиме ‘a’:

file = open("out. txt", "a")

Тогда, выполняя эту программу, мы в файле увидим уже шесть строчек. И смотрите, в зависимости от режима доступа к файлу, мы должны использовать или методы для записи, или методы для чтения. Например, если вот здесь попытаться прочитать информацию с помощью метода read:

file.read()

то возникнет ошибка доступа. Если же мы хотим и записывать и считывать информацию, то можно воспользоваться режимом a+:

file = open("out.txt", "a+")

Так как здесь файловый указатель стоит на последней позиции, то для считывания информации, поставим его в самое начало:

   file.seek(0)
   print( file.read() )

А вот запись данных всегда осуществляется в конец файла.

Следующий полезный метод для записи информации – это writelines:

file.writelines(["Hello1\n", "Hello2\n"])

Он записывает несколько строк, указанных в коллекции. Иногда это бывает удобно, если в процессе обработки текста мы имеем список и его требуется целиком поместить в файл.

Чтение и запись в бинарном режиме доступа

Что такое бинарный режим доступа? Это когда данные из файла считываются один в один без какой-либо обработки. Обычно это используется для сохранения и считывания объектов. Давайте предположим, что нужно сохранить в файл вот такой список:

books = [
("Евгений Онегин", "Пушкин А.С.", 200),
("Муму", "Тургенев И.С.", 250),
("Мастер и Маргарита", "Булгаков М.А.", 500),
("Мертвые души", "Гоголь Н.В.", 190)
]

Откроем файл на запись в бинарном режиме:

file = open("out.bin", "wb")

Далее, для работы с бинарными данными подключим специальный встроенный модуль pickle:

import pickle

И вызовем него метод dump:

pickle.dump(books, file)

Все, мы сохранили этот объект в файл. Теперь прочитаем эти данные. Откроем файл на чтение в бинарном режиме:

file = open("out.bin", "rb")

и далее вызовем метод load модуля pickle:

bs = pickle.load(file)

Все, теперь переменная bs ссылается на эквивалентный список:

print( bs )

Аналогичным образом можно записывать и считывать сразу несколько объектов. Например, так:

import pickle
 
book1 = ["Евгений Онегин", "Пушкин А.С.", 200]
book2 = ["Муму", "Тургенев И.С.", 250]
book3 = ["Мастер и Маргарита", "Булгаков М.А.", 500]
book4 = ["Мертвые души", "Гоголь Н.В.", 190]
 
try:
    file = open("out.bin", "wb")
 
    try:
        pickle.dump(book1, file)
        pickle.dump(book2, file)
        pickle.dump(book3, file)
        pickle.dump(book4, file)
 
    finally:
        file.close()
 
except FileNotFoundError:
    print("Невозможно открыть файл")

А, затем, считывание в том же порядке:

    file = open("out. bin", "rb")
    b1 = pickle.load(file)
    b2 = pickle.load(file)
    b3 = pickle.load(file)
    b4 = pickle.load(file)
 
    print( b1, b2, b3, b4, sep="\n" )

Вот так в Python выполняется запись и считывание данных из файла.

Задания для самоподготовки

1. Выполните считывание данных из текстового файла через символ и записи прочитанных данных в другой текстовый файл. Прочитывайте так не более 100 символов.

2. Пользователь вводит предложение с клавиатуры. Разбейте это предложение по словам (считать, что слова разделены пробелом) и сохраните их в столбец в файл.

3. Пусть имеется словарь:

d = {«house»: «дом», «car»: «машина»,
     «tree»: «дерево», «road»: «дорога»,
     «river»: «река»}

Необходимо каждый элемент этого словаря сохранить в бинарном файле как объект. Затем, прочитать этот файл и вывести считанные объекты в консоль.

Видео по теме

#1. Первое знакомство с Python Установка на компьютер

#2. Варианты исполнения команд. Переходим в PyCharm

#3. Переменные, оператор присваивания, функции type и id

#4. Числовые типы, арифметические операции

#5. Математические функции и работа с модулем math

#6. Функции print() и input(). Преобразование строк в числа int() и float()

#7. Логический тип bool. Операторы сравнения и операторы and, or, not

#8. Введение в строки. Базовые операции над строками

#9. Знакомство с индексами и срезами строк

#10. Основные методы строк

#11. Спецсимволы, экранирование символов, row-строки

#12. Форматирование строк: метод format и F-строки

#13. Списки — операторы и функции работы с ними

#14. Срезы списков и сравнение списков

#15. Основные методы списков

#16. Вложенные списки, многомерные списки

#17. Условный оператор if. Конструкция if-else

#18. Вложенные условия и множественный выбор. Конструкция if-elif-else

#19. Тернарный условный оператор. Вложенное тернарное условие

#20. Оператор цикла while

#21. Операторы циклов break, continue и else

#22. Оператор цикла for. Функция range()

#23. Примеры работы оператора цикла for. Функция enumerate()

#24. Итератор и итерируемые объекты. Функции iter() и next()

#25. Вложенные циклы. Примеры задач с вложенными циклами

#26. Треугольник Паскаля как пример работы вложенных циклов

#27. Генераторы списков (List comprehensions)

#28. Вложенные генераторы списков

#29. Введение в словари (dict). Базовые операции над словарями

#30. Методы словаря, перебор элементов словаря в цикле

#31. Кортежи (tuple) и их методы

#32. Множества (set) и их методы

#33. Операции над множествами, сравнение множеств

#34. Генераторы множеств и генераторы словарей

#35. Функции: первое знакомство, определение def и их вызов

#36. Оператор return в функциях. Функциональное программирование

#37. Алгоритм Евклида для нахождения НОД

#38. Именованные аргументы. Фактические и формальные параметры

#39. Функции с произвольным числом параметров *args и **kwargs

#40. Операторы * и ** для упаковки и распаковки коллекций

#41. Рекурсивные функции

#42. Анонимные (lambda) функции

#43. Области видимости переменных. Ключевые слова global и nonlocal

#44. Замыкания в Python

#45. Введение в декораторы функций

#46. Декораторы с параметрами. Сохранение свойств декорируемых функций

#47. Импорт стандартных модулей. Команды import и from

#48. Импорт собственных модулей

#49. Установка сторонних модулей (pip install). Пакетная установка

#50. Пакеты (package) в Python. Вложенные пакеты

#51. Функция open. Чтение данных из файла

#52. Исключение FileNotFoundError и менеджер контекста (with) для файлов

#53. Запись данных в файл в текстовом и бинарном режимах

#54. Выражения генераторы

#55. Функция-генератор. Оператор yield

#56. Функция map. Примеры ее использования

#57. Функция filter для отбора значений итерируемых объектов

#58. Функция zip. Примеры использования

#59. Сортировка с помощью метода sort и функции sorted

#60. Аргумент key для сортировки коллекций по ключу

#61. Функции isinstance и type для проверки типов данных

#62. Функции all и any. Примеры их использования

#63. Расширенное представление чисел. Системы счисления

#64. Битовые операции И, ИЛИ, НЕ, XOR. Сдвиговые операторы

#65. Модуль random стандартной библиотеки

#66. Аннотация базовыми типами

#67. Аннотации типов коллекций

#68. Аннотации типов на уровне классов

#69. Конструкция match/case. Первое знакомство

#70. Конструкция match/case с кортежами и списками

#71. Конструкция match/case со словарями и множествами

#72. Конструкция match/case. Примеры и особенности использования

os.path — Общие манипуляции с путями — Документация по Python 3.11.2

Исходный код: Lib/posixpath.py (для POSIX) и Lib/ntpath.py (для Windows).


Этот модуль реализует некоторые полезные функции для путей. Читать или писать файлы см. open() , а для доступа к файловой системе см. os модуль. Параметры пути могут быть переданы в виде строк, байтов или любого объекта. реализация протокола os.PathLike .

В отличие от оболочки Unix, Python не выполняет никаких автоматических расширений пути. Можно вызывать такие функции, как expanduser() и expandvars() . явно, когда приложению требуется расширение пути, похожее на оболочку. (Смотрите также модуль glob .)

См. также

Модуль pathlib предлагает объекты пути высокого уровня.

Примечание

Все эти функции принимают либо только байты, либо только строковые объекты в качестве их параметры. Результатом является объект того же типа, если путь или возвращается имя файла.

Примечание

Так как разные операционные системы имеют разные соглашения об именах путей, несколько версий этого модуля в стандартной библиотеке. Модуль os.path всегда является модулем пути, подходящим для операционной system, на которой работает Python, и поэтому может использоваться для локальных путей. Однако, вы также можете импортировать и использовать отдельные модули, если хотите манипулировать путь всегда в одном из разных форматов. Все они имеют тот же интерфейс:

Изменено в версии 3.8: exists() , lexists() , isdir() , isfile() , islink() и ismount() теперь возвращают False вместо создание исключения для путей, содержащих символы или байты непредставим на уровне ОС.

os.path.abspath( путь )

Вернуть нормализованную абсолютизированную версию пути path . На большинстве платформах, это эквивалентно вызову функции нормпат() как следует: normpath(join(os.getcwd(), путь)) .

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.basename ( путь )

Вернуть базовое имя pathname path . Это второй элемент пара возвращается путем передачи пути функции split() . Обратите внимание, что результат этой функции другой из программы Unix basename ; где базовое имя для '/foo/bar/' возвращает 'bar' , функция basename() возвращает пустая строка ( '' ).

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.commonpath ( путей )

Возвращает самый длинный общий подпуть каждого имени пути в последовательности путей . Поднимите ValueError , если путей содержат как абсолютные и относительные пути, пути находятся на разных дисках или если путей пусто. В отличие от commonprefix() , это возвращает действительный путь.

Доступность: Unix, Windows.

Новое в версии 3.5.

Изменено в версии 3.6: Принимает последовательность объектов, подобных пути.

os.path.commonprefix (список )

Возвращает самый длинный префикс пути (взятый посимвольно), который является префикс всех путей в списке . Если список пуст, вернуть пустую строку ( '' ).

Примечание

Эта функция может возвращать недопустимые пути, поскольку она работает персонаж за раз. Чтобы получить правильный путь, см. общий путь() .

 >>> os.path.commonprefix(['/usr/lib', '/usr/local/lib'])
'/usr/л'
>>> os.path.commonpath(['/usr/lib', '/usr/local/lib'])
'/ уср'
 

Изменено в версии 3. 6: Принимает объект, подобный пути.

os.path.dirname ( путь )

Вернуть имя каталога pathname path . Это первый элемент пара возвращается путем передачи path функции split() .

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.exists( путь )

Возврат Истинно , если путь ссылается на существующий путь или открытый дескриптор файла. Возвращает False для битых символических ссылок. На на некоторых платформах эта функция может возвращать False , если разрешение не разрешено выполнять os.stat() в запрошенном файле, даже если путь физически существует.

Изменено в версии 3.3: путь теперь может быть целым числом: True возвращается, если это дескриптор открытого файла, False в противном случае.

Изменено в версии 3. 6: Принимает объект, подобный пути.

os.path.lexists( путь )

Возврат Истинно , если путь ссылается на существующий путь. Возвращает True для битые символические ссылки. Эквивалентно exists() на платформах, отсутствующих os.lstat() .

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.expanduser( путь )

В Unix и Windows верните аргумент с начальным компонентом ~ или ~пользователь заменен домашним каталогом этого пользователя .

В Unix начальные значения ~ заменяются переменной среды HOME . если он установлен; в противном случае домашний каталог текущего пользователя ищется в каталог паролей через встроенный модуль pwd . Начальный ~пользователь ищется непосредственно в каталоге паролей.

В Windows будет использоваться ПРОФИЛЬ ПОЛЬЗОВАТЕЛЯ , если установлено, в противном случае используется комбинация из HOMEPATH и HOMEDRIVE будут использоваться. инициал ~пользователь обрабатывается путем проверки того, что последний компонент каталога текущего домашний каталог пользователя соответствует USERNAME и заменяет его, если это так.

Если расширение не удалось или если путь не начинается с тильды, путь вернулся без изменений.

Изменено в версии 3.6: Принимает объект, подобный пути.

Изменено в версии 3.8: больше не использует HOME в Windows.

os.path.expandvars( путь )

Вернуть аргумент с развернутыми переменными среды. Подстроки формы $name или ${name} заменяются значением переменной окружения имя . Неверные имена переменных и ссылки на несуществующие переменные оставлен без изменений.

В Windows поддерживаются расширения %name% в дополнение к $name и $ {имя} .

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.getatime ( путь )

Возвращает время последнего доступа к пути . Возвращаемое значение представляет собой число с плавающей запятой, дающее количество секунд с начала эпохи (см. модуль time ). Поднимать OSError , если файл не существует или недоступен.

os.path.getmtime ( путь )

Возвращает время последней модификации пути . Возвращаемое значение представляет собой число с плавающей запятой дающее количество секунд с начала эпохи (см. модуль time ). Поднимите OSError , если файл не существует или недоступен.

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.getctime ( путь )

Возвращает ctime системы, которое в некоторых системах (например, Unix) является временем последнее изменение метаданных, а в других (например, в Windows) время создания для путь . Возвращаемое значение представляет собой число, указывающее количество секунд, прошедших с начала эпохи (см. модуль время ). Поднимите OSError , если файл не существует или недоступен.

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.getsize( путь )

Возвращает размер в байтах пути . Поднимите OSError , если файл не существует или недоступен.

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.isabs( путь )

Возврат Истина , если путь является абсолютным путем. В Unix это означает, что начинается с косой черты, в Windows она начинается с (обратной) косой черты после разрезания с потенциальной буквы диска.

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.isfile( путь )

Возврат Истинно , если путь равен существующий обычный файл. Это следует за символическими ссылками, поэтому оба islink() и isfile() могут быть верным для одного и того же пути.

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.isdir( путь )

Возврат Истинно , если путь является существующим каталогом . Этот следует символическим ссылкам, поэтому оба islink() и isdir() могут быть истинными для того же пути.

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.islink ( путь )

Возврат Истинно , если путь ссылается на существующий каталог запись, которая является символической ссылкой. Всегда Ложь , если символические ссылки не поддерживается средой выполнения Python.

Изменено в версии 3.6: Принимает объект, подобный пути.

os. path.ismount( путь )

Возврат Истина , если путь путь является точкой монтирования : точка в файловая система, в которой смонтирована другая файловая система. В POSIX Функция проверяет, находится ли родительский путь , путь /.. , на другом устройство, чем путь , или путь /.. и путь указывают на одно и то же i-node на том же устройстве — это должно определять точки монтирования для всех Unix и варианты POSIX. Он не может надежно обнаруживать монтирования привязки на та же файловая система. В Windows корневая буква диска и общий ресурс UNC всегда точки монтирования, а для любого другого пути GetVolumePathName вызывается чтобы увидеть, отличается ли он от входного пути.

Новое в версии 3.4: поддержка обнаружения некорневых точек монтирования в Windows.

Изменено в версии 3.6: Принимает объект, подобный пути.

os. path.join ( путь , * пути )

Интеллектуальное соединение одного или нескольких сегментов пути. Возвращаемое значение — это конкатенация путей и всех членов *путей , ровно с одним разделитель каталогов после каждой непустой части, кроме последней. То есть, результат будет заканчиваться разделителем только в том случае, если последняя часть либо пуста, либо заканчивается разделителем. Если сегмент является абсолютным путем (который в Windows требуется и диск, и корень), то все предыдущие сегменты игнорируются и объединение продолжается с сегмента абсолютного пути.

В Windows диск не сбрасывается, когда корневой сегмент пути (например, r'\foo' ). Если сегмент находится на другом диске или является абсолютный путь, все предыдущие сегменты игнорируются, и диск сбрасывается. Примечание что, поскольку для каждого диска существует текущий каталог, os.path.join("c:", "foo") представляет путь относительно текущего каталог на диске C: ( c:foo ), а не c:\foo .

Изменено в версии 3.6: принимает объект, подобный пути, за путь и путь .

os.path.normcase( путь )

Нормализовать регистр имени пути. В Windows преобразовать все символы в путь к нижнему регистру, а также преобразовать прямую косую черту в обратную косую черту. В других операционных системах верните путь без изменений.

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.normpath( путь )

Нормализуйте имя пути, удалив избыточные разделители и повысив уровень ссылки, так что A//B , A/B/, A/./B и A/foo/../B все стать A/B . Эта манипуляция со строкой может изменить значение пути который содержит символические ссылки. В Windows он преобразует косую черту в обратные косые черты. Чтобы нормализовать регистр, используйте normcase() .

Примечание

В системах POSIX в соответствии со стандартом IEEE Std 1003. 1, издание 2013 г.; 4.13 Разрешение имени пути, если путь начинается ровно с двух косых черт, первый компонент следующие ведущие символы могут быть интерпретированы в зависимости от реализации образом, хотя более двух ведущих символов должны рассматриваться как одиночный персонаж.

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.realpath( путь , * , strict=False )

Вернуть канонический путь к указанному имени файла, исключая любые символические ссылки, встречающиеся в пути (если они поддерживаются система).

Если путь не существует или встречается цикл символической ссылки, а строгий Истинно , Ошибка ОС поднят. Если strict равно False , путь разрешено, насколько это возможно, и любой остаток добавляется без проверки существует ли он.

Примечание

Эта функция эмулирует процедуру операционной системы для создания пути канонический, который немного отличается между Windows и UNIX в отношении как взаимодействуют ссылки и последующие компоненты пути.

API-интерфейсы операционной системы делают пути каноническими по мере необходимости, поэтому обычно необходимо вызвать эту функцию.

Изменено в версии 3.6: Принимает объект, подобный пути.

Изменено в версии 3.8: Символические ссылки и соединения теперь разрешаются в Windows.

Изменено в версии 3.10: Добавлен параметр strict .

os.path.relpath( путь , start=os.curdir )

Вернуть относительный путь к файлу пути либо из текущего каталога, либо из необязательного каталога start . Это вычисление пути: к файловой системе нет доступа для подтверждения существования или характера путь или начало . В Windows ValueError возникает, когда путь и начинаются находятся на разных дисках.

start по умолчанию os.curdir .

Доступность: Unix, Windows.

Изменено в версии 3. 6: Принимает объект, подобный пути.

os.path.samefile( путь2 , путь3 )

Вернуть True , если оба аргумента имени пути относятся к одному и тому же файлу или каталогу. Это определяется номером устройства и номером i-узла и вызывает исключение, если Вызов os.stat() по любому пути завершается ошибкой.

Доступность: Unix, Windows.

Изменено в версии 3.2: Добавлена ​​поддержка Windows.

Изменено в версии 3.4: Windows теперь использует ту же реализацию, что и все другие платформы.

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.sameopenfile( fp1 , fp2 )

Возврат Истина , если файловые дескрипторы fp1 и fp2 относятся к одному и тому же файлу.

Доступность: Unix, Windows.

Изменено в версии 3.2: Добавлена ​​поддержка Windows.

Изменено в версии 3. 6: Принимает объект, подобный пути.

os.path.samestat( stat1 , stat2 )

Вернуть True , если кортежи статистики stat1 и stat2 ссылаются на один и тот же файл. Эти структуры могли быть возвращены os.fstat() , os.lstat() или os.stat() . Эта функция реализует базовое сравнение, используемое samefile() и sameopenfile() .

Доступность: Unix, Windows.

Изменено в версии 3.4: Добавлена ​​поддержка Windows.

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.split( путь )

Разделить имя пути путь на пару, (голова, хвост) , где хвост — это последний компонент пути и head — все, что к этому ведет. хвост часть никогда не будет содержать косую черту; если путь заканчивается косой чертой, хвост будет пуст. Если в нет косой черты, путь , заголовок будет пустым. Если путь пуст, как головка , так и хвост пусты. Завершающие косые черты удален из заголовка , если это не корень (только одна или несколько косых черт). В все случаи, join(head, tail) возвращает путь к тому же месту, что и path (но строки могут отличаться). Также см. функции dirname() и имя_базы() .

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.splitdrive ( путь )

Разделить путь путь на пару (диск, хвост) , где диск либо точка монтирования или пустая строка. В системах, не использующих диск технические характеристики, диск всегда будет пустой строкой. Во всех случаях диск + хвост будет таким же, как путь .

В Windows разделяет путь на диск/UNC точку доступа и относительный путь.

Если путь содержит букву диска, диск будет содержать все до двоеточия включительно:

 >>> раздельный диск("c:/dir")
("с:", "/дир")
 

Если путь содержит путь UNC, диск будет содержать имя хоста и разделить, до, но не включая четвертый разделитель:

 >>> splitdrive("//хост/компьютер/каталог")
("//хост/компьютер", "/каталог")
 

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.splitext( путь )

Разделить путь путь на пару (root, ext) таким образом, чтобы root + ext == path , а расширение ext пусто или начинается с точки и содержит в самый один период.

Если путь не содержит расширения, доб будет '' :

 >>> раздельный текст('бар')
('бар', '')
 

Если путь содержит расширение, то ext будет установлено на это расширение, включая ведущий период. Обратите внимание, что предыдущие периоды будут игнорироваться:

 >>> splitext('foo. bar.exe')
('foo.bar', '.exe')
>>> splitext('/foo/bar.exe')
('/foo/bar', '.exe')
 

Начальные периоды последнего компонента пути считаются быть частью корня:

 >>> раздельный текст('.cshrc')
('.cshrc', '')
>>> разделенный текст('/foo/....jpg')
('/foo/....jpg', '')
 

Изменено в версии 3.6: Принимает объект, подобный пути.

os.path.supports_unicode_filenames

True , если в качестве имен файлов можно использовать произвольные строки Unicode (с ограничениями навязанная файловой системой).

Обработка файлов в Python [Полная серия] — PYnative

В этом руководстве вы изучите работу с файлами в Python, файловые операции, такие как открытие файла, чтение из него, запись в него, закрытие, переименование файла , удаление файла и различные файловые методы.

Для временного и постоянного хранения данных мы используем файлы. Файл — это набор данных, хранящихся на диске в виде одного блока, идентифицируемого по имени файла.

Работа с файлами в Python

Серия по работе с файлами

Эта серия по работе с файлами Python содержит следующее подробное руководство . Вы можете напрямую прочитать их.

  • Создать файл в Python : вы научитесь создавать файл в текущем или указанном каталоге. Кроме того, создайте файл с датой и временем в качестве имени. Наконец, создайте файл с разрешениями.
  • Открыть файл в Python : вы научитесь открывать файл, используя как относительные, так и абсолютные пути. Различные режимы доступа к файлам для открытия файла в режиме чтения и записи.
  • Чтение файла в Python : вы научитесь читать как текстовые, так и двоичные файлы с помощью Python. Различные режимы чтения файла. Все методы для чтения текстового файла, такие как read() , readline() и readlines()
  • Запись в файл Python : Вы научитесь записывать/добавлять содержимое в текстовые и двоичные файлы с помощью Python. Все методы для записи текста в файл, такие как write() , writelines() .
  • File Seek(): Переместить позицию указателя файла : Вы научитесь использовать функцию seek() для перемещения позиции указателя файла при чтении или записи файла.
  • Переименовать файлы в Python : вы научитесь переименовывать один файл или несколько файлов. Переименование файлов, соответствующих шаблону. Переименуйте все файлы в папке.
  • Удаление файлов и каталогов в Python : вы научитесь удалять файлы с помощью модуля os и модуля pathlib. Удалять файлы, соответствующие шаблону (шаблону). Удалить каталог и все файлы из него
  • Копирование файлов и каталогов в Python : вы научитесь использовать модули os, Shutil и Subprocess для копирования файлов и папок из одного места в другое.
  • Перемещение файлов или каталогов в Python : вы научитесь перемещать одиночные и множественные файлы. Кроме того, перемещайте файлы, соответствующие шаблону (шаблону), или перемещайте весь каталог
  • Викторина по работе с файлами Python

Часто задаваемые вопросы : В приведенном ниже списке приведены решения распространенных вопросов и проблем, с которыми вы можете столкнуться при работе с файлами и каталогами в Python.

  • Python Проверить, существует ли файл
  • Размер файла проверки Python
  • Python подсчитывает количество строк в файле
  • Python Поиск строки в текстовых файлах
  • Чтение определенных строк из файла в Python
  • Удалить строки из файла в Python
  • Запись списка в файл на Python
  • Список файлов Python в каталоге
  • Python подсчитывает количество файлов в каталоге
  • Список файлов Python в каталоге с расширением txt
  • Python Удалить/удалить непустую папку
  • Python Get Создание и изменение файла DateTime

Типы файлов
  • Текстовый файл : Текстовый файл обычно используется для хранения символьных данных. Например, test.txt
  • Двоичный файл : Двоичные файлы используются для хранения двоичных данных, таких как изображения, видеофайлы, аудиофайлы и т. д.

Путь к файлу

Путь к файлу определяет расположение файла или папки в компьютерной системе. Есть два способа указать путь к файлу.

  1. Абсолютный путь : который всегда начинается с корневой папки
  2. Относительный путь : который относится к текущему рабочему каталогу программы

Абсолютный путь включает полный список каталогов, необходимый для поиска файла.

Например, /user/Pynative/data/sales.txt — это абсолютный путь для обнаружения файла sales.txt. Вся информация, необходимая для поиска файла, содержится в строке пути.

После имени файла часть с точкой (.) называется расширением файла, и это говорит нам о типе файла. Здесь project.pdf — это документ в формате pdf.

путь к файлу

Чтение файла

Чтобы прочитать или записать файл, нам нужно открыть этот файл. Для этой цели Python предоставляет встроенную функцию открыть() .

Передать путь к файлу и режим доступа функции open(file_path, access_mode) . Он возвращает файловый объект. Этот объект используется для чтения или записи файла в соответствии с режимом доступа.

Режим доступа представляет цель открытия файла. Например, R для чтения и W для записи

В этой статье мы будем использовать файл test.txt для управления всеми файловыми операциями. Создайте text.txt на своем компьютере и напишите в нем приведенное ниже содержимое, чтобы начать работу с файлами.

 Добро пожаловать на PYnative.com
Это образец.txt
Линия 3
Линия 4
Строка 5 

Пример :

 # Открытие файла с абсолютным путем
fp = open(r'E:\demos\files\sample.txt', 'r')
# прочитать файл
печать (fp.read())
# Закрываем файл после прочтения
fp.close()

# путь, если вы используете MacOs
# fp = open(r"/Users/myfiles/sample.txt", "r") 

Вывод:

 Добро пожаловать на PYnative. com
Это образец.txt
Линия 3
Линия 4
Строка 5 

Подробнее :

  • Создать файл в Python:
  • Открыть файл в Python
  • Чтение файла в Python
  • Чтение определенных строк из файла в Python

Примечание :

Когда мы открываем файл, операционная система дает дескриптор для чтения и записи файла. После того, как мы закончили использовать файл, настоятельно рекомендуется закрыть его. Поскольку закрытый файл снижает риск его необоснованного изменения, он также освобождает ресурсы, связанные с файлом.

Режимы доступа к файлам

В следующей таблице показаны различные режимы доступа, которые мы можем использовать при открытии файла в Python.

Режим Описание
р Открывает существующий файл в режиме только для чтения. Указатель файла существует в начале.
руб Открывает файл только для чтения в двоичном формате. Указатель файла существует в начале.
р+ Он открывает файл для чтения и записи. Указатель файла существует в начале.
руб+ Он открывает файл для чтения и записи как в двоичном формате. Указатель файла находится в начале файла.
ш Файл открывается только для записи. Он перезаписывает файл, если он уже существовал, или создает новый, если файла с таким именем не существует.
вб Открывает файл для записи только в двоичном формате. Он перезаписывает файл, если он существовал ранее, или создает новый, если файла не существует.
с+ Открывает файл для записи и чтения данных. Он переопределит существующие данные.
шб+ Открывает файл для записи и чтения как в двоичном формате
и Открывает файл в режиме добавления. Он не будет переопределять существующие данные. Он создает новый файл, если файл с таким именем не существует.
аб Открывает файл в режиме добавления в двоичном формате.
а+ Он открывает файл для добавления и чтения.
аб+ Открывает файл для добавления и чтения в двоичном формате.
Режим доступа к файлу

Запись в файл

Чтобы записать содержимое в файл, используйте режим доступа w , чтобы открыть файл в режиме записи.

Примечание :

  • Если файл уже существует, он усекает существующее содержимое и помещает дескриптор файла в начало файла. Новый файл создается, если указанный файл не существует.
  • Если вы хотите добавить содержимое в конец файла, используйте режим доступа и , чтобы открыть файл в режиме добавления

Пример

 text = "Это новый контент"
# запись нового содержимого в файл
fp = открыть ("write_demo. txt", 'w')
fp.write(текст)
print('Готово')
fp.close() 

Подробнее :

  • Запись в файл на Python

Перемещение указателя файла

Метод seek() используется для изменения или перемещения позиции маркера файла в указанное место. Курсор определяет, где данные должны быть прочитаны или записаны в файле.

Позиция (индекс) первого символа в файлах ноль , точно так же, как индекс строки .

Пример

 f = open("sample.txt", "r")
# перейти к 11 символу
f.искать(11)
# читать с 11-го символа
печать(f.read()) 

Выход :

 PYnative.com
Это образец.txt
Линия 3
Линия 4
Строка 5 

Метод tell() для возвращает текущую позицию указателя файла от начала файла.

tell() Пример

 f = open("sample.txt", "r")
# прочитать первую строку
f. readline()
# получить текущую позицию дескриптора файла
печать (f.tell())

# Выход 25 

Подробнее : Полное руководство по File Seek(): Перемещение позиции указателя файла

Файловые методы Python

Python имеет различные доступные методы, которые мы можем использовать с файловым объектом . В следующей таблице показан файловый метод.

Метод Описание
чтение() Возвращает содержимое файла.
readline() Чтение одной строки
readlines() Считать файл в список
обрезать (размер) Изменяет размер файла до указанного размера.
запись() Записывает указанную строку в файл.
строк записи() Записывает в файл список строк.
закрыть() Закрывает открытый файл.
искать() Установить позицию указателя файла в файле
рассказать() Возвращает текущее местоположение файла.
файлно() Возвращает число, представляющее поток с точки зрения операционной системы.
смыв() Сбрасывает внутренний буфер.
Методы файловых объектов

Копирование файлов

В Python существует несколько способов копирования файлов. метод Shutil.copy() используется для копирования содержимого исходного файла в целевой файл.

Пример

 импортный шаттл

src_path = r"E:\demos\files\report\profit.txt"
dst_path = r"E:\demos\files\account\profit.txt"
Shutil.copy(src_path, dst_path)
print('Copied') 

Подробнее :

  • Копирование файлов в Python
  • Перемещение файлов в Python

Переименовать файлы

В Python модуль os предоставляет функции для операций обработки файлов, таких как переименование, удаление файла и т. д. Модуль os обеспечивает взаимодействие с операционной системой.

Модуль os предоставляет метод rename() для переименования указанного имени файла в новое имя. Синтаксис метода rename() показан ниже.

Пример

 импорт ОС

# Абсолютный путь к файлу
old_name = r"E:\demos\files\reports\details.txt"
new_name = r"E:\demos\files\reports\new_details.txt"

# Переименование файла
os.rename(old_name, new_name) 

Подробнее :

  • Переименовать файлы в Python

Удалить файлы

В Python модуль os предоставляет функцию remove() для удаления или удаления пути к файлу.

 импорт ОС

# удалить файл с абсолютным путем
os.remove(r"E:\demos\files\sales_2.txt") 

Подробнее :

  • Удалить файлы и каталоги в Python
  • Удалить строки из файла в Python

Работа с байтами

Байт состоит из 8 битов, а биты состоят из 0 или 1.