Python абсолютный путь к файлу в windows

Начиная с версии Python 3.4, для задания пути к файлу рекомендуется использовать модуль pathlib с классом Path. Определить путь к рабочей директории..
путь к файлу в Python

Как задать путь к файлу в Python?

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

Самый простой вариант — не самый верный!

Внимание! У этого способа обнаружен недостаток!

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

Пример относительного пути:
path = "Files/info.txt" # в Линуксе, или:
path = "Filesinfo.txt" # в Windows

Где вместо «Files» и «info.txt» Вы напишите названия ваших директорий и имя вашего файла соответственно.

Пример абсолютного пути:
path = "/home/my_comp/Files/info.txt" # для Линукс, или:
path = "C:Pythonpythonw.exeFilesinfo.txt" # для Windows

Где вместо «C:Pythonpythonw.exeFilesinfo.txt», «home/my_comp/Files/» и «info.txt» Вы напишите названия ваших директорий и имя вашего файла соответственно.

Этот вариант рабочий, однако, один существенный недостаток лишил его внимания разработчиков. Проблема заключается в том, что заданные таким способом пути адаптированы только к одному виду операционной системы: к Линукс, либо к Windows, так как в Windows используются обратные слеши «», а в Линукс — обычные «/». Из-за этого скрипт, показывавший отличные результаты в Windows, начнет жаловаться на отсутствие файлов по прописанному пути в Linux, и наоборот. А с абсолютным путем вообще все сложно: никакого диска «C:» в Линуксе нет. Скрипт опять будет ругаться! Что же делать? Правильно указать путь к файлу!

Указываем путь к файлу правильно!

Внимание! Годный вариант!

Python — умный змей, поэтому в его арсенале, начиная с 3.4 версии появился модуль pathlib, который позволяет вытворять самые приятные вещи с путями к файлу, стоит только импортировать его класс Path:

import pathlib
from pathlib import Path

Кстати, если у вас не установлен модуль pathlib, это легко исправить с помощью команды:

pip install pathlib

Задаем относительный путь с помощью Path!

После того, как класс импортирован, мы получаем власть над слешами! Теперь вопрос о прямых и обратных слешах в разных операционных системах ложится на плечи Path. Используя Path, вы можете корректно задать относительный путь, который будет работать в разных системах.

Например, в случае расположения файлов, как на представленном изображении, относительный путь, определяемый в скрипте «main_script.py», сформируется автоматически из перечисленных в скобках составных частей. Pathlib инициализирует новый объект класса Path, содержимым которого станет сформированный для Вашей системы относительный путь (в Windows части пути будут разделены обратными слешами, в Linux — обычными):

import pathlib
from pathlib import Path  
path = Path("files", "info", "docs.txt") 

## выведем значение переменной path:
print(str(path))
## выведем значение переменной path:
files/info/docs.txt  

У нас появился Telegram-канал для изучающих Python! Канал совсем свежий, подпишись одним из первых, ведь вместе «питонить» веселее! 😉 Ссылка на канал: «Кодим на Python!»

Задаем абсолютный путь с помощью Path

  • cwd() — возвращает путь к рабочей директории
  • home() — возвращает путь к домашней директории

Полученную строку, содержащую путь к рабочей или домашней директории, объединим с недостающими участками пути при инициализации объекта класса Path :

Пример 1: с использованием функции cwd():
import pathlib
from pathlib import Path

#Получаем строку, содержащую путь к рабочей директории:
dir_path = pathlib.Path.cwd()

# Объединяем полученную строку с недостающими частями пути
path = Path(dir_path, 'files','info', 'docs.txt')

# выведем значение переменной path:
print(str(path))
# выведем значение переменной path:
"/home/my_comp/python/files/info/docs.txt"

В данном случае путь к директории имеет вид: dir_path = «/home/my_comp/python», а полный путь к файлу «docs.txt» будет иметь вид: «/home/my_comp/python/files/info/docs.txt».

Представленный выше код можно оптимизировать и записать в одну строку:

import pathlib
from pathlib import Path
path = Path(pathlib.Path.cwd(), 'files', 'info', 'docs.txt')

# значение переменной path:
print(str(path))
# значение переменной path:
"/home/my_comp/python/files/info/docs.txt"
Пример2: с использованием функции home():
import pathlib
from pathlib import Path

#Получаем строку, содержащую путь к домашней директории:
dir_path = pathlib.Path.home()

# Объединяем полученную строку с недостающими частями пути
path = Path(dir_path, 'files','info', 'docs.txt')

# Выведем значение переменной path:
print(str(path))
# Выведем значение переменной path:
"/home/my_comp/files/info/docs.txt"

В данном случае путь к директории имеет вид: dir_path = «/home/my_comp», а полный путь к файлу ‘docs.txt’ будет иметь вид: «/home/my_comp/files/info/docs.txt».

Сократим представленный выше код:

import pathlib
from pathlib import Path
path = Path(pathlib.Path.home(), 'files', 'info', 'docs.txt')

# Значение переменной path:
print(str(path))
# Значение переменной path:
"/home/my_comp/files/info/docs.txt"

Подведем итог: начиная с версии Python 3.4, для задания пути к файлу рекомендуется использовать модуль pathlib с классом Path. Определить путь к рабочей директории можно с помощью функции cwd(), а путь к домашней директории подскажет функция home().

Given a path such as "mydir/myfile.txt", how do I find the file’s absolute path in Python? E.g. on Windows, I might end up with:

"C:/example/cwd/mydir/myfile.txt"

Marc Compere's user avatar

asked Sep 9, 2008 at 10:19

izb's user avatar

0

>>> import os
>>> os.path.abspath("mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'

Also works if it is already an absolute path:

>>> import os
>>> os.path.abspath("C:/example/cwd/mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'

JakeD's user avatar

JakeD

2,6331 gold badge19 silver badges28 bronze badges

answered Sep 9, 2008 at 10:21

sherbang's user avatar

sherbangsherbang

15.5k1 gold badge22 silver badges16 bronze badges

8

You could use the new Python 3.4 library pathlib. (You can also get it for Python 2.6 or 2.7 using pip install pathlib.) The authors wrote: «The aim of this library is to provide a simple hierarchy of classes to handle filesystem paths and the common operations users do over them.»

To get an absolute path in Windows:

>>> from pathlib import Path
>>> p = Path("pythonw.exe").resolve()
>>> p
WindowsPath('C:/Python27/pythonw.exe')
>>> str(p)
'C:\Python27\pythonw.exe'

Or on UNIX:

>>> from pathlib import Path
>>> p = Path("python3.4").resolve()
>>> p
PosixPath('/opt/python3/bin/python3.4')
>>> str(p)
'/opt/python3/bin/python3.4'

Docs are here: https://docs.python.org/3/library/pathlib.html

Martijn Pieters's user avatar

answered Oct 24, 2014 at 1:05

twasbrillig's user avatar

twasbrilligtwasbrillig

16.1k9 gold badges40 silver badges62 bronze badges

4

import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))

Note that expanduser is necessary (on Unix) in case the given expression for the file (or directory) name and location may contain a leading ~/(the tilde refers to the user’s home directory), and expandvars takes care of any other environment variables (like $HOME).

answered Mar 7, 2019 at 0:56

benjimin's user avatar

benjiminbenjimin

3,60527 silver badges41 bronze badges

1

Install a third-party path module (found on PyPI), it wraps all the os.path functions and other related functions into methods on an object that can be used wherever strings are used:

>>> from path import path
>>> path('mydir/myfile.txt').abspath()
'C:\example\cwd\mydir\myfile.txt'

wim's user avatar

wim

323k97 gold badges584 silver badges719 bronze badges

answered Sep 12, 2008 at 6:53

Tom's user avatar

TomTom

41.7k33 gold badges94 silver badges101 bronze badges

5

Update for Python 3.4+ pathlib that actually answers the question:

from pathlib import Path

relative = Path("mydir/myfile.txt")
absolute = relative.absolute()  # absolute is a Path object

If you only need a temporary string, keep in mind that you can use Path objects with all the relevant functions in os.path, including of course abspath:

from os.path import abspath

absolute = abspath(relative)  # absolute is a str object

answered Dec 27, 2018 at 20:41

Mad Physicist's user avatar

Mad PhysicistMad Physicist

104k25 gold badges174 silver badges257 bronze badges

This always gets the right filename of the current script, even when it is called from within another script. It is especially useful when using subprocess.

import sys,os

filename = sys.argv[0]

from there, you can get the script’s full path with:

>>> os.path.abspath(filename)
'/foo/bar/script.py'

It also makes easier to navigate folders by just appending /.. as many times as you want to go ‘up’ in the directories’ hierarchy.

To get the cwd:

>>> os.path.abspath(filename+"/..")
'/foo/bar'

For the parent path:

>>> os.path.abspath(filename+"/../..")
'/foo'

By combining "/.." with other filenames, you can access any file in the system.

answered Feb 28, 2019 at 15:26

Lucas Azevedo's user avatar

3

You can use this to get absolute path of a specific file.

from pathlib import Path

fpath = Path('myfile.txt').absolute()

print(fpath)

answered Aug 30, 2021 at 14:44

Dhia Shalabi's user avatar

Dhia ShalabiDhia Shalabi

1,24011 silver badges25 bronze badges

1

Given a path such as mydir/myfile.txt, how do I find the file’s absolute path relative to the current working directory in Python?

I would do it like this,

import os.path
os.path.join( os.getcwd(), 'mydir/myfile.txt' )

That returns '/home/ecarroll/mydir/myfile.txt'

answered Feb 8, 2022 at 6:20

Evan Carroll's user avatar

Evan CarrollEvan Carroll

75.9k45 gold badges251 silver badges443 bronze badges

if you are on a mac

import os
upload_folder = os.path.abspath("static/img/users")

this will give you a full path:

print(upload_folder)

will show the following path:

>>>/Users/myUsername/PycharmProjects/OBS/static/img/user

answered Apr 3, 2018 at 21:12

chikwapuro's user avatar

chikwapurochikwapuro

1,3281 gold badge9 silver badges10 bronze badges

1

In case someone is using python and linux and looking for full path to file:

>>> path=os.popen("readlink -f file").read()
>>> print path
abs/path/to/file

answered Jul 4, 2018 at 19:09

BND's user avatar

BNDBND

5729 silver badges21 bronze badges

Given a path such as "mydir/myfile.txt", how do I find the file’s absolute path in Python? E.g. on Windows, I might end up with:

"C:/example/cwd/mydir/myfile.txt"

Marc Compere's user avatar

asked Sep 9, 2008 at 10:19

izb's user avatar

0

>>> import os
>>> os.path.abspath("mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'

Also works if it is already an absolute path:

>>> import os
>>> os.path.abspath("C:/example/cwd/mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'

JakeD's user avatar

JakeD

2,6331 gold badge19 silver badges28 bronze badges

answered Sep 9, 2008 at 10:21

sherbang's user avatar

sherbangsherbang

15.5k1 gold badge22 silver badges16 bronze badges

8

You could use the new Python 3.4 library pathlib. (You can also get it for Python 2.6 or 2.7 using pip install pathlib.) The authors wrote: «The aim of this library is to provide a simple hierarchy of classes to handle filesystem paths and the common operations users do over them.»

To get an absolute path in Windows:

>>> from pathlib import Path
>>> p = Path("pythonw.exe").resolve()
>>> p
WindowsPath('C:/Python27/pythonw.exe')
>>> str(p)
'C:\Python27\pythonw.exe'

Or on UNIX:

>>> from pathlib import Path
>>> p = Path("python3.4").resolve()
>>> p
PosixPath('/opt/python3/bin/python3.4')
>>> str(p)
'/opt/python3/bin/python3.4'

Docs are here: https://docs.python.org/3/library/pathlib.html

Martijn Pieters's user avatar

answered Oct 24, 2014 at 1:05

twasbrillig's user avatar

twasbrilligtwasbrillig

16.1k9 gold badges40 silver badges62 bronze badges

4

import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))

Note that expanduser is necessary (on Unix) in case the given expression for the file (or directory) name and location may contain a leading ~/(the tilde refers to the user’s home directory), and expandvars takes care of any other environment variables (like $HOME).

answered Mar 7, 2019 at 0:56

benjimin's user avatar

benjiminbenjimin

3,60527 silver badges41 bronze badges

1

Install a third-party path module (found on PyPI), it wraps all the os.path functions and other related functions into methods on an object that can be used wherever strings are used:

>>> from path import path
>>> path('mydir/myfile.txt').abspath()
'C:\example\cwd\mydir\myfile.txt'

wim's user avatar

wim

323k97 gold badges584 silver badges719 bronze badges

answered Sep 12, 2008 at 6:53

Tom's user avatar

TomTom

41.7k33 gold badges94 silver badges101 bronze badges

5

Update for Python 3.4+ pathlib that actually answers the question:

from pathlib import Path

relative = Path("mydir/myfile.txt")
absolute = relative.absolute()  # absolute is a Path object

If you only need a temporary string, keep in mind that you can use Path objects with all the relevant functions in os.path, including of course abspath:

from os.path import abspath

absolute = abspath(relative)  # absolute is a str object

answered Dec 27, 2018 at 20:41

Mad Physicist's user avatar

Mad PhysicistMad Physicist

104k25 gold badges174 silver badges257 bronze badges

This always gets the right filename of the current script, even when it is called from within another script. It is especially useful when using subprocess.

import sys,os

filename = sys.argv[0]

from there, you can get the script’s full path with:

>>> os.path.abspath(filename)
'/foo/bar/script.py'

It also makes easier to navigate folders by just appending /.. as many times as you want to go ‘up’ in the directories’ hierarchy.

To get the cwd:

>>> os.path.abspath(filename+"/..")
'/foo/bar'

For the parent path:

>>> os.path.abspath(filename+"/../..")
'/foo'

By combining "/.." with other filenames, you can access any file in the system.

answered Feb 28, 2019 at 15:26

Lucas Azevedo's user avatar

3

You can use this to get absolute path of a specific file.

from pathlib import Path

fpath = Path('myfile.txt').absolute()

print(fpath)

answered Aug 30, 2021 at 14:44

Dhia Shalabi's user avatar

Dhia ShalabiDhia Shalabi

1,24011 silver badges25 bronze badges

1

Given a path such as mydir/myfile.txt, how do I find the file’s absolute path relative to the current working directory in Python?

I would do it like this,

import os.path
os.path.join( os.getcwd(), 'mydir/myfile.txt' )

That returns '/home/ecarroll/mydir/myfile.txt'

answered Feb 8, 2022 at 6:20

Evan Carroll's user avatar

Evan CarrollEvan Carroll

75.9k45 gold badges251 silver badges443 bronze badges

if you are on a mac

import os
upload_folder = os.path.abspath("static/img/users")

this will give you a full path:

print(upload_folder)

will show the following path:

>>>/Users/myUsername/PycharmProjects/OBS/static/img/user

answered Apr 3, 2018 at 21:12

chikwapuro's user avatar

chikwapurochikwapuro

1,3281 gold badge9 silver badges10 bronze badges

1

In case someone is using python and linux and looking for full path to file:

>>> path=os.popen("readlink -f file").read()
>>> print path
abs/path/to/file

answered Jul 4, 2018 at 19:09

BND's user avatar

BNDBND

5729 silver badges21 bronze badges

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

Содержание

  • Файлы и файловая система

    • Свойства файла

    • Путь к файлу: абсолютный и относительный

    • Операции с файлами

    • Виды файлов

  • Файловый объект в Python

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

    • Основные свойства и методы

    • Простое чтение и запись

    • Чтение файла целиком

  • Сериализация и десериализация

    • Модуль pickle

    • Популярные форматы файлов

      • CSV

      • JSON

8.1.1. Файлы и файловая система¶

Файл (англ. File) — именованная область данных на носителе информации.

Файлы хранятся в файловой системе — каталоге, определяющим способ организации, хранения и именования данных, а также задающем ограничения на формат и доступ к данным. На сегодняшний день наиболее популярными являются древовидные каталоги (также директории или папки) — файлы, содержащие записи о входящих в них файлах (Рисунок 8.1.1).

_images/08_01_01.png

Рисунок 8.1.1 — Пример древовидной организации файловой системы в ОС Windows 6.

Файловая система связывает носитель информации с одной стороны и программный интерфейс для доступа к файлам — с другой. Когда прикладная программа обращается к файлу, она не имеет никакого представления о том, каким образом расположена информация в конкретном файле, так же как и на каком физическом типе носителя (CD, жестком диске, магнитной ленте, блоке флеш-памяти или другом) он записан. Все, что знает программа — это имя файла, его размер и атрибуты (получая их от драйвера файловой системы). Именно файловая система устанавливает, где и как будет записан файл на физическом носителе (например, жестком диске) (Рисунок 8.1.2).

_images/08_01_02.png

Рисунок 8.1.2 — Файловая система предоставляет интерфейс доступа к файлам для операционной системы 7

8.1.1.1. Свойства файла¶

Файл может обладать различным набором свойств в зависимости от файловой системы.

В большинстве файловых систем файл имеет следующие свойства:

  • имя и расширение (как правило, называемые просто именем вместе): например, моя_программа.py;

  • дата/время (могут быть предусмотрены маркеры создания, модификации и последнего доступа);

  • владелец;

  • атрибуты (скрытый, системный и др.) и права доступа.

Имя файла имеет определенные ограничения в зависимости от файловой и операционной системы, в частности, допустимые знаки и длину наименования. Расширение указывается после имени через точку, имея назначение, в основном, для ОС Windows, где определяет приложение для запуска файла.

8.1.1.2. Путь к файлу: абсолютный и относительный¶

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

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

Путь может быть:

  • абсолютным (полным): указывает на одно и то же место в файловой системе вне зависимости от текущей рабочей директории или других обстоятельств;

  • относительным: путь по отношению к текущему рабочему каталогу пользователя или активных приложений.

Примеры путей для ОС Windows и UNIX:

  • ОС Windows:

    • абсолютный: C:userpythonexample1.py;

    • относительный: example1.py если текущий каталог C:userpython;

    • относительный: pythonexample1.py если текущий каталог C:user;

  • ОС UNIX:

    • абсолютный: /home/user/python/example1.py;

    • относительный: example1.py если текущий каталог /home/user/python/;

    • относительный: user/python/example1.py если текущий каталог /home/.

8.1.1.3. Операции с файлами¶

Все операции с файлами можно подразделить на 2 группы:

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

  • выполняющиеся без его открытия: работа с файлом как элементом файловой системы — переименование, копирование, получение атрибутов и др.

При открытии файла, как правило, указываются:

  • имя файла;

  • права доступа

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

8.1.1.4. Виды файлов¶

По способу организации файлы делятся на файлы с последовательным и произвольным доступом (Рисунок 8.1.3, Таблица 8.1.1).

_images/08_01_03.png

Рисунок 8.1.3 — Файлы с последовательным и произвольным доступом 8

Таблица 8.1.1 — Разница в доступе к файлам с последовательным и произвольным доступом

Характеристика

Последовательный доступ

Произвольный доступ

1

Метафора

_images/08_01_01_i.png

_images/08_01_02_i.png

2

Как хранят информацию?

В неструктурированном виде (текстовом)

В структурированном виде (двоичном)

2

Поиск

Для поиска или обращения к определенному участку в файле необходимо его последовательно прочитать с начала

Разрешен непосредственный переход к любой из записи

3

Можно править в текстовом редакторе?

Да

Нет, необходима специальная программа

4

Плюсы

Компактность

Скорость доступа

5

Основное применение

Файлы конфигурации, документы

Файлы баз данных и их производные

6

Пример

Текстовый файл (*.txt и др.)

База данных (*.mdb и др.)

8.1.2. Файловый объект в Python¶

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

Стандартный способ создания файлового объекта — функция open():

open(file, mode=‘r’, buffering=— 1, encoding=None, errors=None, newline=None, closefd=True, opener=None)

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

Некоторые из параметров:

Параметры
  • file – путь к файлу (например, строка) или файловый дескриптор;

  • mode

    режим открытия файла:

    Символ

    Описание

    'r'

    Открыть для чтения (по умолчанию)

    'w'

    Открыть для записи (если файл существует, то очищается)

    'x'

    Открыть для создания с эксклюзивными правами (ошибка, если файл существует)

    'a'

    Открыть для добавления (если файл существует)

    '+'

    Открыть для чтения и записи

    't'

    Текстовый режим (по умолчанию)

    'b'

    Двоичный режим

    Двоичный/текстовый режимы могут быть скомбинированы с другими: например, режим 'rb' позволит открыть на чтение бинарный файл;

  • encoding – наименование кодировки, используемой при чтении/записи файла (например, 'utf-8'); параметр имеет смысл только для текстового режима.

Предупреждение

Кодировка файла

При открытии файла Python по умолчанию использует кодировку, предпочитаемую операционной системой. Для определения кодировки по умолчанию выполните код:

import locale
locale.getpreferredencoding(False)  # 'cp1251' на российской сборке ОС Windows

Старайтесь указывать кодировку файла явно, например, encoding="utf-8", особенно если есть вероятность работы программы на различных ОС.

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

class file
close()

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

Общий цикл работы с файлом может выглядеть следующим образом (Листинг 8.1.1).

Листинг 8.1.1 — Пример цикла работы с файлом | скачать

# При работе с файлами всегда целесообразно использовать исключения

# 1. Стандартный способ открытия файла с обработкой исключений
fh = None
try:
    fh = open("data.txt", encoding="utf-8")
    #
    # Чтение и запись файла
    #
except Exception as e:
    print("Ошибка при работе с файлом:", e)
finally:
    if fh:  # Если файл не открылся, значит 'fh' == None и закрывать его не нужно
        fh.close()

# 2. Для упрощения кода по выделению и высвобождению ресурсов в Python
#    предусмотрены специальные объекты - менеджеры контекста,
#    которые могут самостоятельно следить за использованием ресурсов
#
#    Наиболее часто менеджеры контекста вызываются с использованием ключевого слова with

try:
    with open("data2.txt", encoding="utf-8") as fh:
        #
        # Чтение и запись файла
        #
except Exception as e:
    print("Ошибка при работе с файлом:", e)

Примечание

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

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

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

8.1.3.1. Основные свойства и методы¶

Файловый объект предоставляет ряд свойств и методов для работы с файлами. Большинство методов универсально и предполагают работу (чтение/запись) со строками в указанной кодировке (str для текстовых файлов) или с набором байт (bytes для двоичных файлов).

class file
name

Имя файла (если имеется).

mode

Режим, в котором был открыт файл.

encoding

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

closed

Возвращает True, если файл закрыт.

close()

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

read(count)

Читает до count байт из файлового объекта. Если значение count не определено, то читаются все байты, начиная от текущей позиции и до конца.

Если ничего не было прочитано (конец файла), возвращается пустой объект str или bytes.

readinto(ba)

Читает до len(ba) байт в объект ba типа bytearray и возвращает число прочитанных байт (0, если был достигнут конец файла).

Доступен только в двоичном режиме.

readline(count)

Читает следующую строку (до count байт, если значение count определено и число прочитанных байтов было достигнуто раньше, чем встретился символ перевода строки 'n'), включая символ перевода строки 'n'.

readlines(sizehint)

Читает все строки до конца файла и возвращает их в виде списка.

Если значение аргумента sizehint определено, то будет прочитано примерно sizehint байт (если файл поддерживает такую возможность).

write(s)

Записывает в файл объект s типа:

  • str для текстового режима;

  • bytes / bytearray для двоичного режима.

Примечание

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

writelines(seg)

Записывает в файл последовательность объектов типа:

  • str для текстового режима;

  • bytes / bytearray для двоичного режима.

flush()

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

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

close()

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

8.1.3.2. Простое чтение и запись¶

В Листинге 8.1.2 приведен пример работы с двоичным файлом.

Листинг 8.1.2 — Пример работы с двоичным файлом | скачать

human = dict(name="Михаил Толстых", age=35, weight=90.5)
filename = "08_01_02_data.txt"

# 1. Запись в файл
#    При записи бинарных файлов все данные должны быть преобразованы в тип bytes
#    Удобно выполнить преобразование через метод str.encode()
fh = None
try:
    fh = open(filename, "wb")
    fh.write(bytes(human["name"].encode("utf-8")))
    fh.write(bytes(str(human["age"]).encode("utf-8")))
    fh.write(bytes(str(human["weight"]).encode("utf-8")))
finally:
    if fh:
        fh.close()

# 2. Чтение из файла
#    При чтении бинарных файлов необходимо точно знать, сколько байт
#    прочитать и как их декодировать, используя bytes.decode()
#    При редактировании файла в стороннем редакторе файл может быть не читаем
fh = None
try:
    fh = open(filename, "rb")
    name = fh.read(27).decode("utf-8")
    age = int(fh.read(2).decode("utf-8"))
    weight = float(fh.read(4).decode("utf-8"))
    print(name, age, weight)  # Михаил Толстых 35 90.5
finally:
    if fh:
        fh.close()

В Листинге 8.1.3 приведен пример работы с текстовым файлом.

Листинг 8.1.3 — Пример работы с текстовым файлом | скачать

human = dict(name="Михаил Толстых", age=35, weight=90.5)
filename = "08_01_03_data.txt"

# 1. Запись в файл
#    При записи текстовых файлов все данные должны быть преобразованы в тип str
#    По умолчанию, write() не добавляет перенос строки, однако его можно добавить самостоятельно
fh = None
try:
    fh = open(filename, "w", encoding="utf-8")
    # При добавлении переноса записываемые данные будут на отдельной строке
    fh.write(human["name"] + "n")
    fh.write(str(human["age"]) + "n")
    # Как альтернатива - print() позволяет не переводить в строку и не добавлять перенос вручную
    print(human["weight"], file=fh)
finally:
    if fh:
        fh.close()

# 2. Чтение из файла
#    Для чтения отдельной строки достаточно вызвать метод readline().
#    В конце полученной строки знак переноса - n,
#    который можно убрать, например, методом str.strip()
fh = None
try:
    fh = open(filename, encoding="utf-8")
    # Читаем первые 3 строки и преобразуем при необходимости
    name = fh.readline().strip()
    age = int(fh.readline())
    weight = float(fh.readline())
    print(name, age, weight)  # Михаил Толстых 35 90.5
finally:
    if fh:
        fh.close()

8.1.3.3. Чтение файла целиком¶

Чтение файла, приведенное в Листинге 8.1.3 не подразумевает, что содержимое файла может меняться.

Учитывать такие изменения можно, прочитав файл целиком:

  • в одну строку;

  • в список строк;

  • построчно, пока не достигнут конец файла.

Примеры реализации данных вариантов приведены в Листинге 8.1.4 на примере файла 08_01_04_data.txt:

Содержимое файла 08_01_04_data.txt | скачать

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

Брайан Грин
https://ru.wikipedia.org/wiki/Грин,_Брайан_Рэндолф

Листинг 8.1.4 — Различные способы чтения текстового файла целиком | скачать

filename = "08_01_04_data.txt"

# В данном примере обработка исключений не приводится, чтобы
# сосредоточить внимание на чтении файлов 

# 1. Чтение из файла (в одну строку)
with open(filename, encoding="utf-8") as fh:
    data = fh.read()
    print(data)

# 2. Чтение из файла (в список)
with open(filename, encoding="utf-8") as fh:
    data = fh.readlines()
    print(data)

# ['Когда дети будут смотреть на великих учёных так же,n',
#  'как они смотрят на знаменитых актёров и музыкантов,n',
#  'человечество совершит большой прорыв.n',
#  'n',
#  'Брайан Гринn',
#  'https://ru.wikipedia.org/wiki/Грин,_Брайан_Рэндолфn']

# 3. Чтение из файла (построчно)
with open(filename, encoding="utf-8") as fh:
    for line in fh:
        print(line.strip())

8.1.4. Сериализация и десериализация¶

Чтение/запись простых типов (например, чисел или строк) не представляет большого труда, однако с увеличением объема информации появляется необходимость эффективно сохранять/загружать более сложные структуры данных (например, словари). Кроме того, модульная архитектура современного программного обеспечения приводит к необходимости обмена данными между различными модулями, а также между приложениями в целом, для чего необходимо иметь возможность удобно обмениваться данными.

Сериализация — процесс перевода какой-либо структуры данных в последовательность битов. Десериализация — обратный процесс.

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

8.1.4.1. Модуль pickle

Одним из способов, позволяющих сериализовать/десериализовать данные в Python, является использование стандартного модуля pickle, при помощи которого можно сохранять любой объект Python в двоичном файле, а затем извлекать его обратно.

Основные функции модуля:

pickle.dump(obj, file, protocol=None, *, fix_imports=True)

Сериализует объект obj и записывает его в файл file.

Некоторые из параметров:

Параметры
  • obj – объект для записи;

  • file – файловый объект;

  • protocol – версия формата pickle.

pickle.load(file, *, fix_imports=True, encoding=‘ASCII’, errors=‘strict’)

Читает и десериализует содержимое файла file, возвращая созданный объект (структуру).

Некоторые из параметров:

Параметры

file – файловый объект.

Пример работы с модулем pickle приведен в Листинге 8.1.5.

Листинг 8.1.5 — Использование pickle для загрузки/сохранения объектов Python | скачать

import pickle

filename = "08_01_05_data.txt"
# список покупок
shoplist = {"фрукты": ["яблоки", "манго"],
            "овощи": ["морковь"],
            "бюджет": 1000}

# Запись в файл
with open(filename, "wb") as fh:
    pickle.dump(shoplist, fh)  # помещаем объект в файл

# Считываем из хранилища
shoplist_2 = []
with open(filename, "rb") as fh:
    shoplist_2 = pickle.load(fh)  # загружаем объект из файла
print(shoplist_2)  # {'бюджет': 1000, 'овощи': ['морковь'], 'фрукты': ['яблоки', 'манго']}

Формат файла, создаваемого pickle, приведен на Рисунке 8.1.4.

_images/08_01_04.png

Рисунок 8.1.4 — Содержимое файла с данными при использовании pickle (в редакторе Notepad++)

Минусы формата pickle:

  • специфичен для Python (не может быть использован, если файл будет читаться с использованием других языков программирования);

  • небезопасен (десериализация готовых конструкций языка может привести к выполнению ненадежного кода).

8.1.4.2. Популярные форматы файлов¶

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

Среди них одними из наиболее популярных являются:

  • CSV (англ. Comma-Separated Values — значения, разделенные запятыми);

  • JSON (англ. JavaScript Object Notation) — текстовый формат обмена данными, основанный на JavaScript;

  • XML (англ. eXtensible Markup Language — расширяемый язык разметки);

  • YAML (англ. YAML Ain’t Markup Language — «YAML — Не язык разметки»);

  • INI (англ. Initialization file — файл инициализации);

  • и др.

Подавляющее большинство форматов поддерживается Python (стандартными или сторонними модулями и пакетами).

8.1.4.2.1. CSV¶

CSV (англ. Comma-Separated Values — значения, разделенные запятыми, 2005 г.) — текстовый формат, предназначенный для представления табличных данных. Каждая строка файла — это одна строка таблицы, где значения отдельных колонок разделяются разделительным символом (англ. delimiter) запятой , и заключаются в кавычки " (Рисунок 8.1.5).

_images/08_01_05.png

Несмотря на наличие стандарта (RFC 4180), на сегодняшний день под CSV, как правило, понимают набор значений, разделенных произвольными разделителями, в произвольной кодировке с произвольными окончаниями строк. Это значительно затрудняет перенос данных из одних программ в другие, несмотря на всю простоту реализации поддержки CSV (так, например, Microsoft Excel не всегда открывает стандартные разделенные запятыми данные).

В Python работа с CSV-файлами поддерживается стандартным модулем csv, предоставляющем следующие основные объекты и функции:

csv.reader(csvfile, dialect=‘excel’, **fmtparams)

Создает и возвращает объект для чтения последовательности из CSV-файла.

Некоторые из параметров:

Параметры
  • csvfile – итерируемый объект, возвращающий строку на каждой итерации (например, файловый объект в текстовом режиме доступа);

  • dialect – диалект CSV (набор специальных параметров);

  • fmtparams – дополнительные настройки (совокупность кавычек, разделителей и т.д.).

csv.writer(csvfile, dialect=‘excel’, **fmtparams)

Создает и возвращает объект для записи последовательности в CSV-файл.

Некоторые из параметров:

Параметры
  • csvfile – любой объект, поддерживающий метод записи write();

  • dialect – аналогично csv.reader();

  • fmtparams – аналогично csv.reader().

class csv.DictReader(csvfile, fieldnames=None, restkey=None, restval=None, dialect=‘excel’, *args, **kwds)

Создает и возвращает объект для чтения данных из CSV-файла как словаря значений.

Некоторые из параметров:

Параметры
  • csvfile – итерируемый объект, возвращающий строку на каждой итерации (например, файловый объект в текстовом режиме доступа);

  • fieldnames – список наименований столбцов (если не задан, используется первая строка файла).

class csv.DictWriter(csvfile, fieldnames, restval=», extrasaction=‘raise’, dialect=‘excel’, *args, **kwds)

Создает и возвращает объект для записи данных как словаря значений в CSV-файл.

Некоторые из параметров:

Параметры
  • csvfile – любой объект, поддерживающий метод записи write();

  • fieldnames – список наименований столбцов.

class csv.Writer
writerow(row)

Записывает последовательность row в CSV-файл.

writerows(rows)

Записывает список последовательностей rows в CSV-файл.

class csv.DictWriter

Записывает в файл заголовки файла, переданные при создании класса.

writerow(row)

Записывает словарь row в CSV-файл.

writerows(rows)

Записывает список словарей rows в CSV-файл.

exception csv.Error

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

Пример использования модуля csv приведен в Листинге 8.1.6 (а-б).

Листинг 8.1.6 (а) — Работа с CSV-файлом в Python (последовательность) | скачать

import csv

filename = "08_01_06_a_data.csv"
# список покупок
shoplist = {"яблоки": [2, 100], "манго": [3, 250], "морковь": [1, 35]}

# Запись в файл
with open(filename, "w", encoding="utf-8", newline="") as fh:
    writer = csv.writer(fh, quoting=csv.QUOTE_ALL)
    writer.writerow(["Наименование", "Вес", "Цена/кг."])  # Заголовки столбца
    for name, values in sorted(shoplist.items()):
        writer.writerow([name, *values])
    writer.writerow(["рис", "4", "70"])  # Допишем произвольную запись

# Содержимое файла
#
# "Наименование","Вес","Цена/кг."
# "манго","3","250"
# "морковь","1","35"
# "яблоки","2","100"
# "рис","4","70"

# Чтение файла
rows = []
with open(filename, "r", encoding="utf-8") as fh:
    reader = csv.reader(fh)
    rows = list(reader)  # reader - итерируемый объект и может быть преобразован в список строк

for row in rows:
    print(row)

# Вывод на экран
#
# ['Наименование', 'Вес', 'Цена/кг.']
# ['манго', '3', '250']
# ['морковь', '1', '35']
# ['яблоки', '2', '100']
# ['рис', '4', '70']

Листинг 8.1.6 (б) — Работа с CSV-файлом в Python (словарь) | скачать

import csv

filename = "08_01_06_b_data.csv"
# список покупок
shoplist = {"яблоки": [2, 100], "манго": [3, 250], "морковь": [1, 35]}

# Запись в файл
with open(filename, "w", encoding="utf-8", newline="") as fh:
    writer = csv.DictWriter(fh, fieldnames=["name", "weight", "price"], quoting=csv.QUOTE_ALL)
    writer.writeheader()  # Записывает заголовки в файл
    for name, values in sorted(shoplist.items()):
        writer.writerow(dict(name=name, weight=values[0], price=values[1]))

# Содержимое файла
#
# "name","weight","price"
# "манго","3","250"
# "морковь","1","35"
# "яблоки","2","100"

# Чтение файла
rows = []
with open(filename, "r", encoding="utf-8") as fh:
    reader = csv.DictReader(fh)
    rows = list(reader)  # reader - итерируемый объект и может быть преобразован в список строк

for row in rows:
    print(row)

# Вывод на экран
#
# {'name': 'манго', 'weight': '3', 'price': '250'}
# {'name': 'морковь', 'weight': '1', 'price': '35'}
# {'name': 'яблоки', 'weight': '2', 'price': '100'}

8.1.4.2.2. JSON¶

JSON (англ. JavaScript Object Notation, 1999 г.) — текстовый формат обмена данными, основанный на JavaScript. Одно из преимуществ — JSON легко читается людьми (англ. human-readable) (Листинг 8.1.7).

Листинг 8.1.7 — Пример JSON-файла | скачать

{
	"ФИО": "Иванов Сергей Михайлович",
	"ЕГЭ": {
		"Математика": 90,
		"Физика": 70,
		"Информатика": 80
	},
	"Хобби": ["Рисование", "Плавание"],
	"Возраст": 25.5,
	"ДомЖивотные": null
}

JSON-текст представляет собой одну из двух структур:

  • набор пар ключ: значение (словарь в терминологии Python), где ключ — строка, значение — любой тип;

  • упорядоченный набор значений (список в терминологии Python).

Значением может являться:

  • строка (в кавычках);

  • число;

  • логическое значение (true/false);

  • null;

  • одна из структур.

Одним из преимуществ JSON является близкое соответствие Python по типам данных. Работа с JSON-форматом поддерживается стандартным пакетом json, предоставляющем следующие основные функции:

json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

Сериализует объект obj, возвращая строку в JSON-формате.

Некоторые из параметров:

Параметры
  • obj – сериализуемый объект;

  • ensure_ascii – если равен False, запись не-ASCII значений происходит в файл «как есть», без преобразования в Unicode;

  • indent – величина отступа для вложенных структур.

json.loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

Десериализует объект (в том числе файловый) s, возвращая структуру в Python.

При ошибке десериализации возбуждается исключение JSONDecodeError.

exception json.JSONDecodeError(msg, doc, pos, end=None)

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

Пример работы с JSON-форматом приведен в Листинге 8.1.8.

Листинг 8.1.8 — Работа с JSON-форматом в Python | скачать

import json

filename = "08_01_08_data.json"

info = {
    "ФИО": "Иванов Сергей Михайлович",
    "ЕГЭ": {
        "Математика": 90,
        "Физика": 70,
        "Информатика": 80
    },
    "Хобби": ["Рисование", "Плавание"],
    "Возраст": 25.5,
    "ДомЖивотные": None
}

# Запись структуры в файл в JSON-формате
with open(filename, "w", encoding="utf-8") as fh:
    fh.write(json.dumps(info, ensure_ascii=False, indent=4))

# Пример содержимого файла:
# {
#     "Хобби": [
#         "Рисование",
#         "Плавание"
#     ],
#     "ЕГЭ": {
#         "Информатика": 80,
#         "Математика": 90,
#         "Физика": 70
#     },
#     "ФИО": "Иванов Сергей Михайлович",
#     "ДомЖивотные": null,
#     "Возраст": 25.5
# }

# Чтение из файла JSON-формата
info_2 = []
with open(filename, encoding="utf-8") as fh:
    info_2 = json.loads(fh.read())

print(info_2)
# {'ФИО': 'Иванов Сергей Михайлович', 'ЕГЭ': {'Информатика': 80, 'Математика': 90, 'Физика': 70},
#  'Хобби': ['Рисование', 'Плавание'], 'Возраст': 25.5, 'ДомЖивотные': None}

Примечание

Валидация и оформление JSON-файлов

При возникновении ошибки чтения файла JSON-формата рекомендуется проверить его синтаксис с использованием специальных онлайн-сервисов, например, https://jsonformatter.curiousconcept.com/, которые могут как указать место ошибки, так и оформить его по стандарту.


1

Sebesta, W.S Concepts of Programming languages. 10E; ISBN 978-0133943023.

2

Python — официальный сайт. URL: https://www.python.org/.

3

Python — FAQ. URL: https://docs.python.org/3/faq/programming.html.

4

Саммерфилд М. Программирование на Python 3. Подробное руководство. — М.: Символ-Плюс, 2009. — 608 с.: ISBN: 978-5-93286-161-5.

5

Лучано Рамальо. Python. К вершинам мастерства. — М.: ДМК Пресс , 2016. — 768 с.: ISBN: 978-5-97060-384-0, 978-1-491-94600-8.

6

Что такое папка. URL: http://beginpc.ru/windows/chto-takoe-folder.

7

The Volume Does Not Contain A Recognized File System – How To Fix. URL: https://www.powerdatarecovery.com/hard-drive-recovery/volume-not-contain-recognized-file-system.html.

8

Последовательный доступ. URL: https://ru.wikipedia.org/wiki/Последовательный_доступ.

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

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

# Unix
/path/to/file/text.txt

# Windows
c:pathtofiletext.txt

Он разбит на три основные части:

  1. Путь к файлу /path/to/file/: расположение директории в файловой системе, где папки разделены прямой косой чертой '/' в Unix подобных системах или обратной косой чертой '' в Windows.
  2. Имя файла text: фактическое имя файла.
  3. Расширение .txt: используется для указания типа файла.

Для чтения или записи в файл нам необходимо его открыть, а для этого нужно передать путь к нужному файлу в качестве строки функции open(). Для Unix подобных систем это делается просто:

>>> full_path = '/path/to/file/text.txt'
>>> print(full_path)
# /path/to/file/text.txt

В системе Windows путь включает в себя обратную косую черту ''. Этот символ в строках на Python используется для экранирования escape-последовательностей, таких как новая строка 'n'.

>>> full_path = 'c:pathtofiletext.txt'
>>> print(full_path)
# c:path o
#          ile    ext.txt

Что бы избежать Windows системах такого безобразия, нам нужно вручную экранировать обратную косую черту '\' или передавать в функции open() сырую (необработанную) строку, указав перед первой кавычкой строковой литерал 'r':

# экранируем обратную косую черту
>>> full_path = 'c:\path\to\file\text.txt'
>>> print(full_path)
# c:pathtofiletext.txt

# строковой литерал raw строки
>>> full_path = r'c:pathtofiletext.txt'
>>> print(full_path)
# c:pathtofiletext.txt

А вот как просто создавать и использовать пути при помощи встроенного модуля pathlib. Так как модуль встроенный, то устанавливать ничего не надо.

Строковое представление пути можно посмотреть функцией str() — это сам необработанный путь к файловой системе в собственном виде, например с обратным слешем в Windows, который можно передать любой функции, принимающей путь к файлу в виде строки:

>>> import pathlib

# Код запущен на Unix системах
>>> path = pathlib.Path('/foo', 'bar', 'baz')
>>> path
# PosixPath('/foo/bar/baz')
>>> str(path)
# '/foo/bar/baz'

# Код запущен на Windows системе
>>> path = pathlib.Path('c:/', 'foo', 'bar')
>>> path
# WindowsPath('c:/foo/bar')

# Строковое представление пути
# экранирование происходит автоматически
>>> str(path)
# 'c:\foo\bar'

Переводить путь в текстовое представление не обязательно, т.к. объект пути модуля pathlib принимают все функции.

Оператор косой черты помогает создавать дочерние пути, аналогично os.path.join():

>>> import pathlib
# Сложение путей файловой системы
>>> p = pathlib.Path('/etc')
>>> p
# PosixPath('/etc')
>>> p1 = p / 'init.d' / 'apache2'
>>> p1
# PosixPath('/etc/init.d/apache2')
>>> q = pathlib.Path('bin')
>>> q1 = '/usr' / q
>>> q1
# PosixPath('/usr/bin')
# разложение пути
>>> p = pathlib.Path('c:/Program Files/PSF')
>>> p.parts
# ('c:\', 'Program Files', 'PSF')
>>> p.is_dir()
# True

# определение диска
>>> pathlib.Path('c:/Program Files/').drive
# 'c:'
>>> pathlib.Path('/Program Files/').drive
# ''

# определение родительской директории
>>> p = pathlib.Path('c:/foo/bar/setup.py')
>>> p.is_file()
# True
>>> p.parents[0]
# WindowsPath('c:/foo/bar')
>>> p.parents[1]
# WindowsPath('c:/foo')
>>> p.parents[2]
# WindowsPath('c:/')

# Двигаемся вверх по директории
>>> for up in p.parents:
...     print(up)
... 
# c:foobar
# c:foo
# c:

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

Модуль OS не нуждается в дополнительной установке, так как поставляется вместе с инсталлятором Python.

Получение директорий и списка файлов

Есть несколько способов вернуть список каталогов и файлов по указанному пути. Первый способ используя os.walk, который возвращает генератор:

import os

path = 'C:/windows/system32/drivers/'
print(path)

Получение списка папок и файлов с библиотекой os в Python

Такие объекты можно итерировать для понятного отображения структуры:

import os

path = 'C:/Folder1'
for el in os.walk(path):
    print(el)

Обработка списка директорий и файлов с библиотекой os в Python

Сам кортеж делится на 3 объекта: текущая директория, имя вложенных папок (если есть), список файлов. Я так же разделил их на примере ниже:

import os

path = 'C:/Folder1'
for dirs,folder,files in os.walk(path):
    print('Выбранный каталог: ', dirs)
    print('Вложенные папки: ', folder)
    print('Файлы в папке: ', files)
    print('n')

Разделение директорий и папок с библиотекой os в Python

Os.walk является рекурсивным методом. Это значит, что для поиска файлов в конкретной директории вы будете итерировать и все вложенные папки. Обойти это с помощью самого метода нельзя, но вы можете использовать break так как os.walk возвращает указанную директорию первой. Можно так же использовать next():

import os

path = 'C:/Folder1'
for dirs,folder,files in os.walk(path):
    print('Выбранный каталог: ', dirs)
    print('Вложенные папки: ', folder)
    print('Файлы в папке: ', files)
    print('n')
    # Отобразит только корневую папку и остановит цикл
    break

# Отобразит первый итерируемый объект
directory = os.walk(path)
print(next(directory))

Вывод первой директории с OS walk в Python

Получение файлов через listdir

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

import os

path = 'C:/Folder1'
directory = os.listdir(path)
print(directory)

Вывод списка файлов и папок с библиотекой os.listdir в Python

Получение полного абсолютного пути к файлам

Для последующего чтения файла нам может понадобится абсолютный путь. Мы можем использовать обычный метод сложения строк или метод os.path.join, который сделает то же самое, но и снизит вероятность ошибки если программа работает на разных ОС:

import os

path = 'C:/Folder1'
for dirs,folder,files in os.walk(path):
    print('Выбранный каталог: ', dirs)
    print('Вложенные папки: ', folder)
    print('Файлы в папке: ', files)
    print('Полный путь к файлу: ', os.path.join(dirs, files))
    

Получение абсолютного пути с os.path.join в Python

Исключение каталогов или файлов из списка

У нас может быть список полных путей, например из списка выше, из которого мы хотим исключить папки или файлы. Для этого используется os.path.isfile:

import os

path = ['C:/Folder1',
        'C:/Folder1/Folder2/file2.txt']
for el in path:
    if os.path.isfile(el):
        print('Это файл: ', el)
    else:
        print('Это папка: ', el)

Проверка папок и файлов с os.path.os.isfile()

Такой же принцип имеют следующие методы:

  • os.path.isdir() — относится ли путь к папке;
  • os.path.islink() — относится ли путь к ссылке;

Получение расширения файлов

Расширение файла можно получить с помощью os.path.splittext(). Этот метод вернет путь до расширения и само расширение. Этот метод исключает ситуацию, когда точка может стоять в самом пути. Если в качестве пути мы выберем каталог (который не имеет расширения) , результатом будет пустая строка:

import os

path = ['C:/Folder1',
        'C:/Folder1/Folder2/file2.txt']
for el in path:
    print(os.path.splitext(el))

Получение расширений файлов с os.path.splittext в Python

os.path.basename(path) — вернет имя файла и расширение.

Создание и удаление директорий

Методы по изменению папок следующие:

  • os.mkdir() — создаст папку;
  • os.rename() — переименует;
  • os.rmdir() — удалит.
import os

# Имя новой папки
path = 'C:/Folder1/NewFolder'
# Ее создание
os.mkdir(path)
# Переименуем папку
os.rename(path, 'C:/Folder1/NewFolder2')
# Удалим
os.rmdir('C:/Folder1/NewFolder2')
    

Создание и удаление директорий в Python с os.mkdir и os.rmdir

Если попытаться создать несколько вложенных папок сразу, используя предыдущий пример, появится ошибка FileNotFoundError. Создание папок включая промежуточные выполняется с os.makedirs():

import os

path = 'C:/Folder1/Folder1/Folder1/'
os.makedirs(path)

Проверка директорий и файлов на существование

Если мы пытаемся создать папку с существующим именем, то получим ошибку FileExistsError. Один из способов этого избежать — использование os.path.exists(), который вернет True в случае существования файла или папки:

import os

path = ['C:/Folder1/file1.txt',
		'C:/Folder1/NotExistFolder']
for el in path:
	if os.path.exists(el):
		print('Такой путь существует: ', el)
	else:
		print('Такого пути нет', el)

Проверка существование пути с os.path.exists в Python

Получение и изменение текущей директории

Запуская любую программу или консоль, например CMD, мы это делаем из определенной директории. С этой и соседней директорией мы можем работать без указания полного пути. Для того что бы узнать такую директорию в Python используется метод os.getcwd():

import os

current_dir = os.getcwd()
print(current_dir)

Получение текущей директории с os.getcwd в Python

В директории ‘D:’ сохранен мой файл, с которого я запускаю методы. Вы можете изменить такую директорию с os.chdir() . Такой подход удобен, когда файлы, с которыми вы работаете в основном находятся в другом месте и вы сможете избежать написания полного пути:

import os

current_dir = os.getcwd()
print(current_dir)
new_dir = os.chdir('D:/newfolder/')
print(os.getcwd())

Изменение директории с Python  os.chdir

Так же как и в любых языках, в любых методах описанных выше, вы можете использовать ‘..’ для работы с директорией выше или ‘/’ для работы со внутренней:

import os

# Текущая директория
print(os.getcwd())
# Переход во внутреннюю
old_dir = os.chdir('/newfolder/')
print(os.getcwd())
# Переход на уровень выше
new_dir = os.chdir('..')
print(os.getcwd())

Переход на уровень выше и ниже с os.chdir в Python 

Теги:

#python

#os

Понравилась статья? Поделить с друзьями:
  • Python windows embeddable package 64 bit
  • Qttabbar не устанавливается на windows 10 64
  • Python string utf 8 to windows 1251
  • Qttabbar не работает на windows 10
  • Python str utf 8 to windows 1251