Как задать путь к файлу в 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"
asked Sep 9, 2008 at 10:19
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
2,6331 gold badge19 silver badges28 bronze badges
answered Sep 9, 2008 at 10:21
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
answered Oct 24, 2014 at 1:05
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
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
323k97 gold badges584 silver badges719 bronze badges
answered Sep 12, 2008 at 6:53
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 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
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 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 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
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
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"
asked Sep 9, 2008 at 10:19
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
2,6331 gold badge19 silver badges28 bronze badges
answered Sep 9, 2008 at 10:21
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
answered Oct 24, 2014 at 1:05
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
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
323k97 gold badges584 silver badges719 bronze badges
answered Sep 12, 2008 at 6:53
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 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
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 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 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
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
BNDBND
5729 silver badges21 bronze badges
Файлы используются программами для долговременного хранения информации, как необходимой для собственной работы (например, настройки), так и полученной во время ее исполнения (результаты вычислений и т.д.). Подавляющее большинство программ сегодня в том или ином виде используют файлы, сохраняя результаты работы между сеансами запуска.
Содержание
-
Файлы и файловая система
-
Свойства файла
-
Путь к файлу: абсолютный и относительный
-
Операции с файлами
-
Виды файлов
-
-
Файловый объект в Python
-
Работа с файлами в Python
-
Основные свойства и методы
-
Простое чтение и запись
-
Чтение файла целиком
-
-
Сериализация и десериализация
-
Модуль
pickle
-
Популярные форматы файлов
-
CSV
-
JSON
-
-
8.1.1. Файлы и файловая система¶
Файл (англ. File) — именованная область данных на носителе информации.
Файлы хранятся в файловой системе — каталоге, определяющим способ организации, хранения и именования данных, а также задающем ограничения на формат и доступ к данным. На сегодняшний день наиболее популярными являются древовидные каталоги (также директории или папки) — файлы, содержащие записи о входящих в них файлах (Рисунок 8.1.1).
Рисунок 8.1.1 — Пример древовидной организации файловой системы в ОС Windows 6.¶
Файловая система связывает носитель информации с одной стороны и программный интерфейс для доступа к файлам — с другой. Когда прикладная программа обращается к файлу, она не имеет никакого представления о том, каким образом расположена информация в конкретном файле, так же как и на каком физическом типе носителя (CD, жестком диске, магнитной ленте, блоке флеш-памяти или другом) он записан. Все, что знает программа — это имя файла, его размер и атрибуты (получая их от драйвера файловой системы). Именно файловая система устанавливает, где и как будет записан файл на физическом носителе (например, жестком диске) (Рисунок 8.1.2).
Рисунок 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).
Рисунок 8.1.3 — Файлы с последовательным и произвольным доступом 8¶
№ |
Характеристика |
Последовательный доступ |
Произвольный доступ |
---|---|---|---|
1 |
Метафора |
|
|
2 |
Как хранят информацию? |
В неструктурированном виде (текстовом) |
В структурированном виде (двоичном) |
2 |
Поиск |
Для поиска или обращения к определенному участку в файле необходимо его последовательно прочитать с начала |
Разрешен непосредственный переход к любой из записи |
3 |
Можно править в текстовом редакторе? |
Да |
Нет, необходима специальная программа |
4 |
Плюсы |
Компактность |
Скорость доступа |
5 |
Основное применение |
Файлы конфигурации, документы |
Файлы баз данных и их производные |
6 |
Пример |
Текстовый файл ( |
База данных ( |
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.
Рисунок 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).
Несмотря на наличие стандарта (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
Он разбит на три основные части:
- Путь к файлу
/path/to/file/
: расположение директории в файловой системе, где папки разделены прямой косой чертой'/'
в Unix подобных системах или обратной косой чертой''
в Windows. - Имя файла
text
: фактическое имя файла. - Расширение
.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)
Такие объекты можно итерировать для понятного отображения структуры:
import os
path = 'C:/Folder1'
for el in os.walk(path):
print(el)
Сам кортеж делится на 3 объекта: текущая директория, имя вложенных папок (если есть), список файлов. Я так же разделил их на примере ниже:
import os
path = 'C:/Folder1'
for dirs,folder,files in os.walk(path):
print('Выбранный каталог: ', dirs)
print('Вложенные папки: ', folder)
print('Файлы в папке: ', files)
print('n')
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))
Получение файлов через listdir
Есть еще один метод получения файлов используя listdir. Отличия от предыдущего метода в том, что у нас не будет разделения файлов и папок. Он так же не является рекурсивным:
import os
path = 'C:/Folder1'
directory = os.listdir(path)
print(directory)
Получение полного абсолютного пути к файлам
Для последующего чтения файла нам может понадобится абсолютный путь. Мы можем использовать обычный метод сложения строк или метод 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.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.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.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')
Если попытаться создать несколько вложенных папок сразу, используя предыдущий пример, появится ошибка 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)
Получение и изменение текущей директории
Запуская любую программу или консоль, например CMD, мы это делаем из определенной директории. С этой и соседней директорией мы можем работать без указания полного пути. Для того что бы узнать такую директорию в Python используется метод os.getcwd():
import os
current_dir = os.getcwd()
print(current_dir)
В директории ‘D:’ сохранен мой файл, с которого я запускаю методы. Вы можете изменить такую директорию с os.chdir() . Такой подход удобен, когда файлы, с которыми вы работаете в основном находятся в другом месте и вы сможете избежать написания полного пути:
import os
current_dir = os.getcwd()
print(current_dir)
new_dir = os.chdir('D:/newfolder/')
print(os.getcwd())
Так же как и в любых языках, в любых методах описанных выше, вы можете использовать ‘..’ для работы с директорией выше или ‘/’ для работы со внутренней:
import os
# Текущая директория
print(os.getcwd())
# Переход во внутреннюю
old_dir = os.chdir('/newfolder/')
print(os.getcwd())
# Переход на уровень выше
new_dir = os.chdir('..')
print(os.getcwd())
…
Теги:
#python
#os