Os join path python: os.path — Common pathname manipulations — Python 3.9.2 documentation
Модуль os.path | Кодкамп
Введение
Примеры
Присоединиться Пути
Чтобы объединить два или более компонентов пути, сначала импортируйте модуль os из python, а затем используйте следующее:
import os
os.path.join('a', 'b', 'c')
Преимущество использования os.path заключается в том, что он позволяет коду оставаться совместимым со всеми операционными системами, поскольку при этом используется разделитель, соответствующий платформе, на которой он работает.
Например, результат этой команды в Windows будет:
>>> os.path.join('a', 'b', 'c')
'a\b\c'
В ОС Unix:
>>> os.path.join('a', 'b', 'c')
'a/b/c'
Абсолютный Путь От Относительного Пути
Используйте os.path.abspath
:
>>> os.getcwd()
'/Users/csaftoiu/tmp'
>>> os.path.abspath('foo')
'/Users/csaftoiu/tmp/foo'
>>> os.path.abspath('../foo')
'/Users/csaftoiu/foo'
>>> os. path.abspath('/foo')
'/foo'
Управление компонентами пути
Чтобы отделить один компонент от пути:
>>> p = os.path.join(os.getcwd(), 'foo.txt')
>>> p
'/Users/csaftoiu/tmp/foo.txt'
>>> os.path.dirname(p)
'/Users/csaftoiu/tmp'
>>> os.path.basename(p)
'foo.txt'
>>> os.path.split(os.getcwd())
('/Users/csaftoiu/tmp', 'foo.txt')
>>> os.path.splitext(os.path.basename(p))
('foo', '.txt')
Получить родительский каталог
os.path.abspath(os.path.join(PATH_TO_GET_THE_PARENT, os.pardir))
Если данный путь существует.
проверить, существует ли данный путь
path = '/home/john/temp'
os.path.exists(path)
#this returns false if path doesn't exist or if the path is a broken symbolic link
проверьте, является ли данный путь каталогом, файлом, символической ссылкой, точкой монтирования и т. д.
проверить, является ли данный путь каталогом
dirname = '/home/john/python'
os. path.isdir(dirname)
проверить, является ли данный путь файлом
filename = dirname + 'main.py'
os.path.isfile(filename)
чтобы проверить , если данный путь является символической ссылкой
symlink = dirname + 'some_sym_link'
os.path.islink(symlink)
чтобы проверить , если данный путь является точка монтирования
mount_path = '/home'
os.path.ismount(mount_path)
Синтаксис
Параметры
Примечания
Python os.path.join на Windows — CodeRoad
Я пытаюсь выучить python и создаю программу, которая будет выводить сценарий. Я хочу использовать os.path.join, но довольно запутался. Согласно документам , если я скажу:
os.path.join('c:', 'sourcedir')
Я получаю "C:sourcedir"
. Согласно документам, это нормально, верно?
Но когда я использую команду copytree, Python выведет ее желаемым образом, например:
import shutil
src = os. path.join('c:', 'src')
dst = os.path.join('c:', 'dst')
shutil.copytree(src, dst)
Вот код ошибки, который я получаю:
WindowsError: [Error 3] The system cannot find the path specified: 'C:src/*.*'
Если я оберну os.path.join
с os.path.normpath
, то получу ту же ошибку.
Если это os.path.join
не может быть использовано таким образом, то я запутался в его назначении.
Согласно страницам, предложенным Stack Overflow, косые черты не должны использоваться в join—that правильно, я полагаю?
python
windows
path-manipulation
Поделиться
Источник
Frank E.
11 марта 2010 в 05:38
11 ответов
- python os.path.join on windows игнорирует первый элемент пути?
Рассмотреть следующее: >>> from django.conf import settings >>> import os >>> settings. VIRTUAL_ENV ‘C:/Users/Marcin/Documents/oneclickcos’ >>> settings.EXTRA_BASE ‘/oneclickcos/’ >>> os.path.join(settings.VIRTUAL_ENV,settings.EXTRA_BASE) ‘/oneclickcos/’…
- смешанные косые черты с os.path.join по windows
Я склонен использовать только прямые косые черты для путей ( ‘ / ‘ ), и python доволен этим также на windows. В описании os.path.join говорится, что это правильный путь, если вы хотите перейти на кросс-платформу. Но когда я использую его я получаю смешанные косые черты: import os a = ‘c:/’ b =…
121
Чтобы быть еще более педантичным, наиболее последовательным ответом python doc будет:
mypath = os.path.join('c:', os.sep, 'sourcedir')
Так как вам также нужно os.sep для корневого пути posix:
mypath = os.path.join(os.sep, 'usr', 'lib')
Поделиться
AndreasT
14 октября 2011 в 12:56
59
Windows имеет понятие текущего каталога для каждого диска. Из-за этого "c:sourcedir"
означает «sourcedir» внутри текущего каталога C:, и вам нужно будет указать абсолютный каталог.
Любой из них должен работать и давать тот же результат, но у меня сейчас нет Windows VM, чтобы перепроверить:
"c:/sourcedir"
os.path.join("/", "c:", "sourcedir")
os.path.join("c:/", "sourcedir")
Поделиться
Unknown
11 марта 2010 в 05:52
13
Причина os.path.join('C:', 'src')
не работает так, как вы ожидаете, заключается в том, что что-то в документации, на которую вы ссылаетесь:
Обратите внимание, что на Windows, так как существует
текущий каталог для каждого диска,
os.path.join («c:», «foo») представляет собой
путь относительно текущего каталога
на диске C: (c:foo), а не c:\foo.
Как сказал призрачный пес, вы, вероятно, хотите mypath=os. path.join('c:\\', 'sourcedir')
Поделиться
Smashery
11 марта 2010 в 05:47
- os.path.join неправильное форматирование пути
Я пишу навигатор каталогов командной строки для Windows в Python и немного борюсь с os.path.join. Вот, в сущности, что я пытаюсь сделать: abspath = C:\Python32\Projects\ls.py abspath = abspath.split(‘\\’) print(abspath) #this prints [‘C:’, ‘Python32’, ‘Projects’, ‘ls.py’] if(options.mFlag):…
- правильный способ использования os.path.join() в python
Я наткнулся на эту функцию python os.path.join(). Я хотел знать, какой способ его использования предпочтительнее. os.path.join(r’C:\\’ , r’some_dir_in_C_folder’) или print os.path.join(C:\\ , some_dir_in_C_folder\\) TIA
12
Для системного агностического решения, которое работает как на Windows, так и на Linux, независимо от того, какой входной путь, можно было бы использовать os. path.join(os.sep, rootdir + os.sep, targetdir)
На WIndows:
>>> os.path.join(os.sep, "C:" + os.sep, "Windows")
'C:\\Windows'
На Linux:
>>> os.path.join(os.sep, "usr" + os.sep, "lib")
'/usr/lib'
Поделиться
Scott Gigante
11 июля 2018 в 01:56
11
Чтобы быть педантичным, вероятно, не стоит жестко кодировать либо / либо \ в качестве разделителя путей. Может быть, так будет лучше?
mypath = os.path.join('c:%s' % os.sep, 'sourcedir')
или
mypath = os.path.join('c:' + os.sep, 'sourcedir')
Поделиться
Matt Ball
15 сентября 2011 в 17:56
7
Я бы сказал, что это ошибка (windows)python.
Почему Жук?
Я думаю, что это утверждение должно быть True
os.path.join(*os.path.dirname(os.path.abspath(__file__)).split(os.path.sep))==os.path.dirname(os.path.abspath(__file__))
Но это False
на windows машинах.
Поделиться
georg
01 июля 2013 в 08:09
5
чтобы присоединиться к пути windows, попробуйте
mypath=os.path.join('c:\\', 'sourcedir')
в принципе, вам нужно будет избежать косой черты
Поделиться
ghostdog74
11 марта 2010 в 05:45
4
У вас есть несколько возможных подходов к обработке path на Windows, от самых жестко закодированных (например, использование необработанных строковых литералов или экранирование обратных косых черт) до наименее закодированных. Вот несколько примеров, которые будут работать, как и ожидалось. Используйте то, что лучше соответствует вашим потребностям.
In[1]: from os.path import join, isdir
In[2]: from os import sep
In[3]: isdir(join("c:", "\\", "Users"))
Out[3]: True
In[4]: isdir(join("c:", "/", "Users"))
Out[4]: True
In[5]: isdir(join("c:", sep, "Users"))
Out[5]: True
Поделиться
Marco Gomez
30 октября 2017 в 21:21
0
Согласие с @georg-
Я бы тогда сказал, Зачем нам нужен хромой os.path.join
— лучше использовать str.join
или unicode.join
, например
sys.path.append('{0}'.join(os.path.dirname(__file__).split(os.path.sep)[0:-1]).format(os.path.sep))
Поделиться
SIslam
19 марта 2016 в 09:49
0
Предлагаемые решения интересны и дают хорошую справку, однако удовлетворяют лишь частично. Можно вручную добавить разделитель, если у вас есть один конкретный случай или вы знаете формат входной строки, но могут быть случаи, когда вы хотите сделать это программно на общих входах.
Немного поэкспериментировав, я считаю, что критерий заключается в том, что разделитель пути не добавляется, если первый сегмент является буквой диска, то есть единственной буквой, за которой следует двоеточие, независимо от того, соответствует ли он реальной единице.
Например:
import os
testval = ['c:','c:\\','d:','j:','jr:','data:']
for t in testval:
print ('test value: ',t,', join to "folder"',os.path.join(t,'folder'))
test value: c: , join to "folder" c:folder test value: c:\ , join to "folder" c:\folder test value: d: , join to "folder" d:folder test value: j: , join to "folder" j:folder test value: jr: , join to "folder" jr:\folder test value: data: , join to "folder" data:\folder
Удобным способом проверки критериев и применения коррекции пути может быть использование os. path.splitdrive
, сравнивающего первый возвращаемый элемент с тестовым значением, например t+os.path.sep if os.path.splitdrive(t)[0]==t else t
.
Тест:
for t in testval:
corrected = t+os.path.sep if os.path.splitdrive(t)[0]==t else t
print ('original: %s\tcorrected: %s'%(t,corrected),' join corrected->',os.path.join(corrected,'folder'))
original: c: corrected: c:\ join corrected-> c:\folder original: c:\ corrected: c:\ join corrected-> c:\folder original: d: corrected: d:\ join corrected-> d:\folder original: j: corrected: j:\ join corrected-> j:\folder original: jr: corrected: jr: join corrected-> jr:\folder original: data: corrected: data: join corrected-> data:\folder
вероятно, его можно улучшить, чтобы он был более устойчивым для пространств trailing, и я тестировал его только на windows, но надеюсь, что он дает представление.
См. также Os.path: можете ли вы объяснить это поведение? для получения интересных подробностей о системах, отличных от windows.
Поделиться
Vincenzooo
08 февраля 2020 в 19:02
0
отвечая на ваш комментарий : «Другие’ / / ‘ ‘c:’, ‘c:\\’ не сработали (C:\ \ создали две обратные косые черты, C:\ вообще не сработали)»
На windows использование
os.path.join('c:', 'sourcedir')
автоматически добавит две обратные косые черты \\
перед sourcedir .
Чтобы разрешить путь, так как python работает на windows также с прямыми косыми чертами -> ‘/’, просто добавьте .replace('\\','/')
с os.path.join
, как показано ниже:-
os.path.join('c:\\', 'sourcedir'). replace('\\','/')
например: os.path.join('c:\\', 'temp').replace('\\','/')
вывод: ‘C:/temp’
Поделиться
Pratul
04 февраля 2020 в 17:14
Похожие вопросы:
Непредсказуемые результаты от os.path.join в windows
Итак, то, что я пытаюсь сделать, — это присоединиться к чему-то в форме os.path.join(‘C:\path\to\folder’, ‘filename’). **edit : Фактический код является : filename = ‘creepy_%s.pcl’ % identifier…
Правильные результаты от Python os.path.join()
После прочтения онлайн-документации по методу os.path.join() следующий случай кажется подходящим, но, по-видимому, это не так. Правильно ли я читаю эту документацию? >>> import os…
Почему бы os.path.join не использовать os.path.sep или os.sep?
Как мы знаем, windows принимает как \ , так и / в качестве разделителя. Но в python используется \ . Например, вызов os.path.join(foo,bar) , ‘foo\\bar’ будет возвращен. Что раздражает, так это то,…
python os.path.join on windows игнорирует первый элемент пути?
Рассмотреть следующее: >>> from django.conf import settings >>> import os >>> settings.VIRTUAL_ENV ‘C:/Users/Marcin/Documents/oneclickcos’ >>> settings.EXTRA_BASE…
смешанные косые черты с os.path.join по windows
Я склонен использовать только прямые косые черты для путей ( ‘ / ‘ ), и python доволен этим также на windows. В описании os.path.join говорится, что это правильный путь, если вы хотите перейти на…
os.path.join неправильное форматирование пути
Я пишу навигатор каталогов командной строки для Windows в Python и немного борюсь с os.path.join. Вот, в сущности, что я пытаюсь сделать: abspath = C:\Python32\Projects\ls.py abspath =…
правильный способ использования os. path.join() в python
Я наткнулся на эту функцию python os.path.join(). Я хотел знать, какой способ его использования предпочтительнее. os.path.join(r’C:\\’ , r’some_dir_in_C_folder’) или print os.path.join(C:\\ ,…
Python os.path.join() искажение абсолютного пути в Windows
Я новичок в Python и пытаюсь получить доступ к файлу с полным путем, представленным следующим образом: ‘X:/01 File Folder/MorePath/Data/Test/myfile.txt’ Каждый раз, когда я пытаюсь построить полную…
Необходимо ли os.path.join?
В настоящее время я почти всегда использую os.path.join в своем проекте django для перекрестной поддержки OS; единственные места, где я в настоящее время не использую его, — это имена шаблонов и…
частичное применение с Python os.path.join
В идеале я хотел бы использовать Python functools.partial() на os.path.join() . Мой случай, похоже: os.path.join(input_variable_here, preknown_string) Я полагаю, что мог бы сделать это, создав. ..
python — Почему бы не os.path.join использовать os.path.sep или os.sep?
Как мы знаем, окна принимают и "\"
, и "/"
в качестве разделителя. Но в питоне используется "\"
. Например, вызов os.path.join("foo","bar")
, 'foo\\bar'
будет возвращен. Что раздражает, так это наличие escape-символа, поэтому вы не можете просто скопировать строку пути и вставить ее в адресную строку обозревателя.
Интересно, есть ли способ заставить Python использовать "/"
в качестве разделителя по умолчанию, я попытался изменить значение os.path.sep и os.sep на "/"
, но os.path.join
по-прежнему использовать "\\"
.
Как правильно?
PS:
Я просто не понимаю, почему Python использует «\» в качестве разделителя по умолчанию в Windows, может быть, старая версия Windows не поддерживает «/»?
3
ThemeZ
23 Авг 2012 в 10:50
5 ответов
Лучший ответ
Почему бы не определить пользовательскую функцию отображения?
Например
def display_path(path):
return path. replace("\\", "/")
И если вы хотите заменить str.join
на os.path.join
, вы можете просто сделать это (str.join
ожидает один список, os.path.join
ожидает *args
):
join = lambda *args: "/".join(args)
Возможно, лучше было бы позволить Python все нормализовать, а затем заменить, например:
join = lambda *args: os.path.join(*args).replace("\\", "/")
Единственная проблема с этим может быть в posix, когда в пути к файлу есть пробел.
Затем вы можете поместить оператор if
вверху вашего файла утилит и определить display_path
и join
как неиспользуемые и как os.path.join соответственно, если не в Windows.
1
Jeff Tratner
23 Авг 2012 в 06:58
Это все о том, как Python обнаруживает вашу ОС:
# in os. py
if 'posix' in _names:
...
import posixpath as path
elif 'nt' in _names:
...
import ntpath as path
Итак, в Windows загружен модуль ntpath
. Если вы проверите модули ntpath.py
и posixpath.py
, вы заметите, что ntpath.join()
немного сложнее, и это также из-за упомянутой вами причины: Windows понимает {{X4} } в качестве разделителя пути.
Итог: хотя вы можете использовать posixpath.join()
в Windows (если аргументы имеют формат POSIX
), я бы не рекомендовал это делать.
7
Zaur Nasibov
23 Авг 2012 в 06:56
У меня недостаточно репутации, чтобы комментировать, но ответ выше неверен.
В Windows есть концепция рабочего каталога и рабочего диска. /
обрабатывается как абсолютный путь на текущем рабочем диске , поскольку в Windows отсутствует концепция единого корня. В приведенном выше примере cd /FooBar
переходит к C:\foobar
, потому что рабочий диск — это C:, а не потому, что C: является корневым или каким-то особенным.
Вот пример:
C:\Users\user> cd /
C:\> d:
D:\> cd /Users
The system cannot find the path specified.
D:\> mkdir test
D:\> cd test
D:\test> cd c:/Users
D:\test> cd /
D:\> cd test
D:\test> c:
C:\Users\> d:
D:\test>
0
Mayo
17 Апр 2018 в 23:33
Я бы не рекомендовал делать это.
Обратите внимание, что хотя windows и принимает косую черту /
в качестве разделителя пути, в некоторых контекстах он имеет другое значение.
Он рассматривается как относительный путь, используя cd
, например:
Командная строка:
c: \ Users \ YourUser> cd / FooBar
c: \ FooBar
Здесь /
заменяет букву диска.
Кроме того, я не вижу проблемы с копированием строк, так как если вы print
строка, строка отображается так, как вы хотите:
Интерпретатор Python:
>>> импорт ОС
>>> напечатайте os.path.join («c: \», «foo», «bar»)
c: \ foo \ bar
>>>
1
sloth
23 Авг 2012 в 07:17
Чтобы ответить на ваш вопрос как можно проще, просто используйте posixpath вместо os.path.
Так что вместо:
from os.path import join
join('foo', 'bar')
# will give you either 'foo/bar' or 'foo\\bar' depending on your OS
Использование:
from posixpath import join
join('foo', 'bar')
# will always give you 'foo/bar'
6
semicolon
6 Июн 2014 в 01:53
12086224
Пути в python
У файла есть два(которые важны для нас в этой статье), так сказать, свойства:
1. Имя файла
2. Путь к файлу
В зависимости от используемой системы путь выглядит по разному.
Например Windows имеет вид: C:\Users\…
В Win используется обратный слэш (\), а в OS X и Linux используется прямой слэш (/)
Функция os.path.join() помогает писать пути независимо от используемой системы.
os.path.join(‘user’,’data’)
‘user\\data’ #ответ будет с соответствующими слэшами (один слэш для экранирования)
Допустим нам нужно написать пути:
import os
filename = ‘accounts.txt’
print(os.path.join(‘C:\\’, filename)
‘C:\accounts.txt’
Чтобы получить путь текущей (рабочей) директории воспользуемся функцией os.getcwd()(cwd — current working directory):
import os
os.getcwd()
‘C:\\Python34’
Смена cwd выполняется функцией os.chdir():
import os
os.chdir(‘C:\\Windows\\System32’)
os.getcwd()
‘C:\\Windows\\System32’
Существует два варианта описать путь:
1. Абсолютный путь (полный путь)(АП)
2. Относительный путь (ОП) (путь относительно cwd) тут нам нужно запомнить обозначения папок:
«.\» — значит «Эта директория»
«..\» — директория родитель
Пример:
cwd будет «notdelete» (тоесть все ОП написанны относительно этой папки)
*C:\ # ОП — «..\», АП — «C:\»
*notdelete # ОП — «.\», АП — «C:\notdelete»
*mywork # ОП — «.\mywork», АП — «C:\notdelete\mywork»
*nakedgirls.zip # ОП — «.\mywork\nakedgirls.zip», АП — «C:\notdelete\mywork\nakedgirls.zip
*myphoto # ОП — «..\myphoto», АП — «C:\myphoto»
*sochi.jpg # ОП — «..\myphoto\sochi.jpg», АП — «C:\myphoto\sochi.jpg»
*phones.csv # ОП — «..\phones.csv», АП — «C:\phones.csv»
Создание папок.
Наша программа может создавать папки с помощью функции os.makedirs()
import os
os.makedirs(‘C:\\mywork\\myprojects’) # создаст две папки mywork и myprojescts в диске «C», АП писать не обязательно, можно создавать относительно cwd
Модуль os. path.
Модуль содержит функции призванные помочь нам с отношениями имен файлов и путями к ним. Например os.path.join() помогает нам построить путь, который подойдет для всех ОП. Вот еще несколько примеров:
— os.path.abspath(path) вернет строку с АП (конвертирует ОП в АП)
Пример:
import os
os.path.abspath(‘.’) # вспоминаем, что «.» означает — «ЭТА ДИРЕКТОРИЯ»
‘C:\\Python34’
os.path.abspath(‘..’) # «..» означает — «РОДИТЕЛЬ»
‘C:\\’
— os.pathisabs(path) вернет True если path — АП, false если ОП
— os.path.relpath(path, start) более сложная для понимания функция, проще говоря вернет ОП от start до path. Если start не задан, то будет равен cwd
Пример:
import os
os.path.relpath(‘C:\\Windows’, C:\\notdelete\\mywork’)
‘..\\..\\Windows’ # на примере все становится понятнее, чтобы из mywork попасть в Windows нам нужно попасть сначала в notdelete «..» — так как он родитель mywork, далее из notdelete попасть в C:\ опять «. .» и теперь из C:\ идем в Windows «Windows»
— os.path.dirname(path) вернет всю часть пути до последнего слэша.
Пример:
import os
os.path.dirname(‘C:\\Windows\\System32\\calc.exe’)
‘C:\\Widows\\System32’
-os.path.basename(path) вернет часть пути после последнего слэша.
Пример:
import os
os.path.basename(‘C:\\Windows\\System32\\calc.exe’)
‘calc.exe’
-os.path.split(path) вернет кортеж из («до последнего слэша», «после последнего слэша»)
Пример:
import os
os.path.split(‘C:\\Windows\\System32\\calc.exe’)
(‘C:\\Widows\\System32’, ‘calc.exe’)
(!!! обратите внимание на то, что split работает не как со строками (он не возвращает кортеж из всех папок разделяя их «\\») Чтобы вернуть список из всех папок необходимо использовать os.sep (или os.path.sep не знаю в чем разница) — возвращает разделитель для данной системы («\\» для Win))
Пример:
‘C:\\Windows\\System32\\calc. exe’.split(os.sep)
[‘C:’, ‘Windows’, ‘System32’, ‘calc.exe’]
Размер и содержание папки.
— os.path.getsize(path) вернет размер в байтах файла по пути path
Пример:
import os
os.path.getsize(‘C:\\Windows\\System32\\calc.exe’)
776192
— os.listdir(path) вернет список файлов и папок по пути path
Проверка пути.
Чтобы избежать ошибок связанных с путями в наших скриптах, пути стоит проверять:
— os.path.exists(path) вернет True если файл или папка (или даже диск (например флешечка «H:\\») по пути path существует, иначе вернет False
— os.path.isfile(path) вернет True если путь path существует и ведет к файлу, иначе False
— os.path.isdir(path) вернет True если путь path существует и ведет к папке, иначе False
Проход по дереву каталога.
Есть одна очень полезная функция (os.walk(path)), которая позволяет пройтись по всем файлам и папкам и файлам «подпапок» (короче по всему дереву) нужного нам каталога.
В os.walk(path) передается строка — путь к папке. Возвращает данная функция три значения за каждую итерацию:
1. Строка с именем текущего каталога (где в данный момент прошла итерация)
2. Список строк с именами вложенных каталогов
3. Список строк с именами вложенных файлов
Пример:
Для примера возьмем ранее описанную нами структуру (немного изменив ее):
*C:\
*TEST
*notdelete
*mywork
*nakedgirls.zip
*myphoto
*sochi.jpg
*phones.csv
Код:
import os
for currentFolder, subFolders, fileNames in os.walk(‘C:\\TEST’):
print(‘В папке {} :\n\tСодержатся папки: {}\n\tСодержатся файлы: {}’.format(currentFolder, subFolders, fileNames))
Результат:
В папке C:\TEST :
Содержатся папки: [‘myphoto’, ‘notdelete’]
Содержатся файлы: [‘phones.csv’]
В папке C:\TEST\myphoto :
Содержатся папки: []
Содержатся файлы: [‘sochi. jpg’]
В папке C:\TEST\notdelete :
Содержатся папки: [‘mywork’]
Содержатся файлы: []
В папке C:\TEST\notdelete\mywork :
Содержатся папки: []
Содержатся файлы: [‘nakedgirls.zip’]
Работа с файлами в Django | Recipes
Это перевод постов из одного интересного блога. Оригинал ч.1, ч.2 и ч.3. Описанный подход работает для Django 1.3 и выше.
В этой статье под файлом подразумевается все, что не генерируется динамически. Есть два типа файлов, с которыми работают веб-приложения:
- Файла прописанные в коде и в шаблонах, назовем их
STATIC
файлы. - Файлы, который используются в коде, но известны только в процессе работы кода, назовем их
MEDIA
файлы. Прим.: например файлы загруженные пользователем. Имя файлы мы не знаем и в коде оно не прописано.
Это уловная классификация и основана на определениях из документации Django.
Так как файлы хранятся на диске или других storage backend лучше всего отдавать их через быстрый сервер HTTP и пусть Django обрабатывает только динамический контент.
Настройка
Рассмотрим один из вариантов настройки:
import os
_PATH = os.path.abspath(os.path.dirname(__file__))
MEDIA_ROOT = os.path.join(_PATH, 'files', 'media')
MEDIA_URL = '/media/'
STATIC_ROOT = os.path.join(_PATH, 'files', 'static')
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(_PATH, 'static'),
)
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)
ADMIN_MEDIA_PREFIX = '/static/admin/'
Что такое _PATH
должно быть понятно. В проекте находится папка files
, которая содержит папку media
для MEDIA
файлов и папка static
для STATIC
файлов. Очень важно разделить их таким образом. Потом можете получить много проблем не разделив их изначально. Это позволит вам легко использовать различные версии файлов, расположив их по разным папкам.
Но почему files
в папке проекта? Потому что это удобно при разработке. На «продакшине» рекомендуется вынести files
из проекта и изменить MEDIA_ROOT
и STATIC_ROOT
.
STATIC
файлы располагаются в <_PATH>/static
. Это используемые js и css файлы. Приложение django.contrib.staticfiles соберет все STATIC
файлы из STATICFILES_DIRS
и из соответствующих папок приложений и перенесет в STATIC_ROOT
.
Подведем итоги:
- В
STATIC
добавляются файлы из проекта(смотритеSTATICFILES_DIRS
иFileSystemFinder
), а так жеAppDirectoriesFinder
добавит файлы из папкиstatic
в приложениях. MEDIA
иSTATIC
файла лучше разделить(смотритеSTATIC_ROOT
иMEDIA_ROOT
).STATIC_ROOT
иMEDIA_ROOT
лучше вынести из проекта на «продакшине».
И не забудьте добавить «слеш» в конце STATIC_URL
и MEDIA_URL
!
Как настроить выдачу файлов для dev-сервера
Как упоминалось выше, лучше отдавать файлы через специальный сервер, например Nginx или Apache. Но при разработке это лишние проблемы. Можно легко настроить выдачу файлов средствами Django. Предполагается что при разработке DEBUG
всегда True
, а на сервере — False
. Добавим в urls.py:
from django.conf.urls.static import static
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += staticfiles_urlpatterns()
Все просто. Учтите что urlpatterns
изменится только при DEBUG == True
и если MEDIA_URL
и STATIC_URL
не абсолютны(то есть без http://).
Как использовать STATIC файлы в шаблонах
{% load staticfiles %}
<img src="{% static 'myapp/img/logo.png' %}" />
Как использовать
MEDIA
файлы в шаблоне
Это на много проще. Объект FieldFile
, возвращаемый ImageField
и FileField
, содержит path
и url
:
<img src="{{ some_model. some_image_field.url }}" />
Как добавить STATIC файлы
Так как имена STATIC файлов используются в коде, шаблонах, лучше всего хранить их в VCS вместе с кодом. STATIC файлы собираются(находят и копируются или через simlink) с помощью «finder»-ов. Вам не обязательно знать как все это происходит, главное хранить файлы в нужном месте.
При разработке независимого приложения для Django файлы нужно хранить в папке static
в вашем приложении:
$ ls -1
models.py
static/
templates/
views.py
Файлы, которые относятся конкретно к проекту нужно хранить в папка указанных в STATICFILES_DIRS
:
>>> from django.conf import settings
>>> settings.STATICFILES_DIRS
('/opt/myproject/src/project/static',)
Как загрузить MEDIA файлы
MEDIA файлы в основном используются в моделях с полями FileField и ImageField. Например:
# models.py
from django.db import models
from django. forms.models import modelform_factory
class MediaModel(models.Model):
media_file = models.FileField(upload_to='user_media')
MediaForm = modelform_factory(MediaModel)
# views.py
def media_create(request):
if request.method == "POST":
form = MediaForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('media-list'))
else:
form = MediaForm()
return render_to_response('usermedia/create/html', {'form': form})
os.path — Общие манипуляции с именами путей — документация Python 3.9.2
Исходный код: Lib / posixpath.py (для POSIX) и
Lib / ntpath.py (для Windows NT).
Этот модуль реализует некоторые полезные функции для имен путей. Читать или
для записи файлов см. open ()
, а для доступа к файловой системе см.
os
модуль. Параметры пути могут быть переданы как строки,
или байты. Приложениям рекомендуется представлять имена файлов как
Строки символов (Unicode).К сожалению, некоторые имена файлов могут не совпадать.
представлены в виде строк в Unix, поэтому приложения, которые должны поддерживать
произвольные имена файлов в Unix должны использовать байтовые объекты для представления
имена путей. И наоборот, использование байтовых объектов не может представлять весь файл.
имена в Windows (в стандартной кодировке mbcs
), следовательно, Windows
приложения должны использовать строковые объекты для доступа ко всем файлам.
В отличие от оболочки unix, Python не выполняет никаких автоматических расширений пути .
Можно вызывать такие функции, как expanduser ()
и expandvars ()
.
явно, когда приложение требует расширения пути в виде оболочки.(Смотрите также
модуль glob
.)
См. Также
Модуль pathlib
предлагает высокоуровневые объекты пути.
Примечание
Все эти функции принимают либо только байты, либо только строковые объекты как
их параметры. Результатом является объект того же типа, если путь или
возвращается имя файла.
Примечание
Поскольку разные операционные системы имеют разные соглашения об именах путей,
В стандартной библиотеке есть несколько версий этого модуля.В
os.path Модуль
всегда является модулем пути, подходящим для работы
система Python запущена и поэтому может использоваться для локальных путей. Тем не мение,
вы также можете импортировать и использовать отдельные модули, если хотите управлять
путь, который равен , всегда в одном из разных форматов. У всех есть
тот же интерфейс:
-
os.path.
abspath
( путь ) Вернуть нормализованную абсолютизированную версию пути path .На большинстве
платформ, это эквивалентно вызову функцииnormpath ()
как
следует:normpath (join (os.getcwd (), path))
.
-
os.path.
базовое имя
( путь ) Вернуть базовое имя пути путь . Это второй элемент
пара, возвращенная путем передачи пути функцииsplit ()
. Обратите внимание, что
результат этой функции другой
из программы Unix basename ; где базовое имя для
'/ foo / bar /'
возвращает'bar'
, функцияbasename ()
возвращает
пустая строка (''
).
-
os.path.
общий путь
( путей ) Возвращает самый длинный общий подпуть каждого пути в последовательности
путей . ПоднимитеValueError
, если путей содержат оба абсолютных
и относительные пути, пути находятся на разных дисках или
если пути пустые. В отличие отcommonprefix ()
, это возвращает
действительный путь.Доступность: Unix, Windows.
-
os.path.
общий префикс
( список ) Возвращает префикс самого длинного пути (посимвольно), который является
префикс всех путей в списке . Если список пуст, вернуть пустую строку
(''
).Примечание
Эта функция может возвращать недопустимые пути, потому что она работает
персонаж за раз. Чтобы получить действительный путь, см.
commonpath ()
.>>> os.path.commonprefix (['/ usr / lib', '/ usr / local / lib']) '/ usr / l' >>> os.path.commonpath (['/ usr / lib', '/ usr / local / lib']) '/ usr'
-
os.path.
имя каталога
( путь ) Вернуть имя каталога пути путь . Это первый элемент
пара, возвращенная передачей path функцииsplit ()
.
-
os.path.
существует
( путь ) Вернуть
Истина
, если путь относится к существующему пути или открытому
дескриптор файла.ВозвращаетЛожь
для неработающих символических ссылок. На
на некоторых платформах эта функция может возвращатьFalse
, если разрешение
не предоставлено для выполненияos.stat ()
в запрошенном файле, даже
если путь физически существует.Изменено в версии 3.3: путь теперь может быть целым числом:
Истина
возвращается, если это
дескриптор открытого файла,Ложь
в противном случае.
-
os.path.
лексистов
( путь ) Вернуть
Истина
, если путь ссылается на существующий путь.ВозвращаетTrue
для
битые символические ссылки. Эквивалентсуществует ()
на платформах, не имеющих
os.lstat ()
.
-
os.path.
expanduser
( путь ) В Unix и Windows вернуть аргумент с начальным компонентом
~
или
~ пользователь
заменен домашним каталогом этого пользователя .В Unix начальные
~
заменяются переменной средыHOME
если он установлен; в противном случае домашний каталог текущего пользователя ищется в
каталог паролей через встроенный модульpwd
.Начальный~ пользователь
ищется прямо в каталоге паролей.В Windows будет использоваться
ПРОФИЛЬ ПОЛЬЗОВАТЕЛЯ
, если он установлен, в противном случае — комбинация
изHOMEPATH
иHOMEDRIVE
. Первоначальный
~ пользователь
обрабатывается путем удаления последнего компонента каталога из созданного
путь пользователя, полученный выше.Если раскрытие не удалось или путь не начинается с тильды, путь будет
вернулся без изменений.Изменено в версии 3.8: Больше не использует
HOME
в Windows.
-
os.path.
расширений
( путь ) Вернуть аргумент с раскрытыми переменными среды. Подстроки формы
$ name
или$ {name}
заменяются значением переменной среды
наименование . Неправильные имена переменных и ссылки на несуществующие переменные
оставлен без изменений.В Windows поддерживаются расширения
% name%
в дополнение к$ name
и
$ {name}
.
-
os.path.
getatime
( путь ) Возвращает время последнего доступа пути . Возвращаемое значение — число с плавающей запятой, дающее
количество секунд с начала эпохи (см. модульвремя
). Поднимать
OSError
, если файл не существует или недоступен.
-
os.path.
getmtime
( путь ) Возвращает время последней модификации пути .Возвращаемое значение — число с плавающей запятой.
дающий количество секунд с начала эпохи (см. модульtime
).
ВызовитеOSError
, если файл не существует или недоступен.
-
os.path.
getctime
( путь ) Возвращает системное время ctime, которое в некоторых системах (например, Unix) является временем
последнее изменение метаданных, а в других случаях (например, Windows) — время создания пути .Возвращаемое значение — это число, дающее количество секунд с начала эпохи (см.
модульвремя
). ВызовOSError
, если файл не существует или
недоступен.
-
os.path.
getsize
( путь ) Вернуть размер в байтах пути . Поднимите
OSError
, если файл
не существует или недоступен.
-
os.path.
isabs
( путь ) Вернуть
Истина
, если путь является абсолютным путем.В Unix это означает
начинается с косой черты, в Windows — с косой черты (обратной) после нарезки
с потенциальной буквы диска.
-
os.path.
isfile
( путь ) Вернуть
Истинно
, если путь — этосуществующий обычный файл
.
Это следует за символическими ссылками, поэтому какislink ()
, так иisfile ()
могут
быть верным для того же пути.
-
ос.дорожка.
isdir
( путь ) Вернуть
Истина
, если путь — этосуществующий каталог
. Этот
следует по символическим ссылкам, поэтому иislink ()
, иisdir ()
могут быть истинными
по тому же пути.
-
os.path.
islink
( путь ) Вернуть
Истина
, если путь относится к существующему каталогу
запись, которая является символической ссылкой.ВсегдаЛожь
, если символические ссылки не являются
поддерживается средой выполнения Python.
-
os.path.
ismount
( путь ) Вернуть
Истина
, если путь путь — это точка монтирования : точка в
файловая система, в которой смонтирована другая файловая система. В POSIX
функция проверяет, находится ли родительский путь путь ,путь / ..
, на другом
устройство, чем путь , илипуть /..
и пути указывают на одно и то же
i-node на том же устройстве — это должно определять точки монтирования для всех Unix
и варианты POSIX. Он не может надежно обнаружить крепления на
та же файловая система. В Windows корень с буквой диска и общий UNC
всегда точки монтирования, а для любого другого путиGetVolumePathName вызывается
чтобы увидеть, отличается ли он от пути ввода.Новое в версии 3.4: Поддержка определения точек монтирования без полномочий root в Windows.
-
ос.дорожка.
присоединиться
( путь , * пути ) Разумно объедините один или несколько компонентов пути. Возвращаемое значение — это
конкатенация пути и любых элементов * путей ровно с одним
разделитель каталогов (os.sep
) после каждой непустой части, кроме
last, что означает, что результат будет заканчиваться разделителем, только если последний
часть пуста. Если компонент является абсолютным путем, все предыдущие
компоненты выбрасываются, и соединение продолжается с абсолютного пути
компонент.В Windows буква диска не сбрасывается, если компонент абсолютного пути
(например,r '\ foo'
) встречается. Если компонент содержит привод
буква, все предыдущие компоненты выбрасываются, а буква диска
перезагрузить. Обратите внимание, что, поскольку для каждого диска есть текущий каталог,
os.path.join ("c:", "foo")
представляет путь относительно текущего
каталог на дискеC:
(c: foo
), а неc: \ foo
.
-
ос.дорожка.
нормальный корпус
( путь ) Нормализовать регистр имени пути. В Windows конвертируйте все символы в
путь к нижнему регистру, а также преобразовать косую черту в обратную косую черту.
В других операционных системах вернуть путь без изменений.
-
os.path.
нормальный путь
( путь ) Нормализовать путь путем удаления избыточных разделителей и верхнего уровня
ссылки так, чтобыA // B
,A / B /
,A /./ B
иA / foo /../ B
все
становитсяA / B
. Эта манипуляция со строкой может изменить значение пути
содержащий символические ссылки. В Windows он преобразует косую черту в
обратная косая черта. Чтобы нормализовать регистр, используйтеnormcase ()
.
-
os.path.
реальный путь
( путь ) Вернуть канонический путь указанного имени файла, исключив любые символические
ссылки, встречающиеся в пути (если они поддерживаются действующим
система).Примечание
Когда происходят циклы символьных ссылок, возвращаемый путь будет одним из членов
цикл, но не дается никаких гарантий относительно того, какой член это будет.Изменено в версии 3.8: Символические ссылки и переходы теперь разрешены в Windows.
-
os.path.
relpath
( путь , start = os.curdir ) Вернуть относительный путь к файлу путь либо из текущего каталога, либо
из необязательного каталога start .Это вычисление пути:
к файловой системе не осуществляется доступ для подтверждения существования или природы пути или
начало .start по умолчанию
os.curdir
.Доступность: Unix, Windows.
-
os.path.
samefile
( путь2 , путь3 ) Вернуть
Истина
, если оба аргумента имени пути относятся к одному и тому же файлу или каталогу.
Это определяется номером устройства и номером i-узла и повышает
исключение, еслиos.stat ()
вызывает сбой любого пути.Доступность: Unix, Windows.
Изменено в версии 3.2: Добавлена поддержка Windows.
Изменено в версии 3.4: Windows теперь использует ту же реализацию, что и все другие платформы.
-
os.path.
sameopenfile
( FP1 , FP2 ) Вернуть
True
, если файловые дескрипторы fp1 и fp2 относятся к одному и тому же файлу.Доступность: Unix, Windows.
Изменено в версии 3.2: Добавлена поддержка Windows.
-
os.path.
samestat
( stat1 , stat2 ) Вернуть
Истина
, если кортежи stat stat1 и stat2 относятся к одному и тому же файлу.
Эти структуры могли быть возвращеныos.fstat ()
,
os.lstat ()
илиos.stat ()
. Эта функция реализует
базовое сравнение, используемоеsamefile ()
иsameopenfile ()
.Доступность: Unix, Windows.
Изменено в версии 3.4: Добавлена поддержка Windows.
-
os.path.
разделить
( путь ) Разделить путь путь на пару,
(голова, хвост)
, где хвост — это
последний компонент имени пути и заголовок — это все, что к этому ведет. В
хвостовая часть никогда не будет содержать косую черту; если путь заканчивается косой чертой, хвост
будет пусто.Если в пути нет косой черты, головка будет пустой. Если
путь пуст, и голова и хвост пусты. Завершающие слэши
удаляется из головы , если это не корень (только одна или несколько косых черт). В
во всех случаяхjoin (head, tail)
возвращает путь к тому же месту, что и путь
(но струны могут отличаться). Также см. Функцииdirname ()
и
базовое имя ()
.
-
ос.дорожка.
раздельный привод
( путь ) Разделить путь путь на пару
(диск, хвост)
, где диск либо
точка монтирования или пустая строка. В системах, которые не используют привод
спецификации, диск всегда будет пустой строкой. Во всех случаях привод
будет таким же, как path .
+ tailВ Windows разделяет имя пути на диск / точку общего доступа UNC и относительный путь.
Если путь содержит букву диска, диск будет содержать все
до толстой кишки включительно.
напримерsplitdrive ("c: / dir")
возвращает("c:", "/ dir")
Если путь содержит путь UNC, диск будет содержать имя хоста
и доля, до четвертого разделителя, но не включая его.
напримерsplitdrive ("// хост / компьютер / каталог")
возвращает("// хост / компьютер", "/ каталог")
-
os.path.
splitext
( путь ) Разделить путь путь на пару
(root, ext)
так, чтобыroot + ext ==
, а ext пуст или начинается с точки и содержит не более одного
путь
период.Начальные точки в базовом имени игнорируются;разделенный текст ('. Cshrc')
возвращает('.cshrc', '')
.
-
os.path.
supports_unicode_filenames
Истинно
, если произвольные строки Unicode могут использоваться в качестве имен файлов (в пределах ограничений
наложено файловой системой).
Python | Метод os.path.join () — GeeksforGeeks
Python | os.path.join () метод
Модуль ОС в Python предоставляет функции для взаимодействия с операционной системой.ОС входит в состав стандартных служебных модулей Python. Этот модуль обеспечивает переносимый способ использования функций, зависящих от операционной системы. os.path Модуль — это подмодуль модуля ОС в Python, который используется для управления обычными путями.
Метод os.path.join ()
в Python разумно объединяет один или несколько компонентов пути. Этот метод объединяет различные компоненты пути с помощью ровно одного разделителя каталогов (‘/’), следующего за каждой непустой частью, кроме последнего компонента пути.Если последний соединяемый компонент пути пуст, то в конце ставится разделитель каталогов («/»).
Если компонент пути представляет собой абсолютный путь, то все предыдущие соединенные компоненты отбрасываются, и соединение продолжается с компонента абсолютного пути.
Синтаксис: os.path.join (путь, * пути)
Параметр:
путь : объект, подобный пути, представляющий путь файловой системы.
* путь : объект, похожий на путь, представляющий путь файловой системы.Он представляет компоненты пути, которые необходимо соединить.
Объект, похожий на путь, представляет собой объект строки или байта, представляющий путь.Примечание: Специальный синтаксис * args (здесь * пути) в определениях функций в Python используется для передачи переменного числа аргументов функции.
Тип возвращаемого значения: Этот метод возвращает строку, которая представляет компоненты конкатенированного пути.
Код: Использование метода os.path.join () для соединения различных компонентов пути
|
Выход:
/ домашний / Пользователь / Рабочий стол / файл.текст /home/file.txt /дома / home / User / Public / Documents /
Ссылка: https://docs.python.org/3/library/os.path.html
Внимание компьютерщик! Укрепите свои основы с помощью курса Python Programming Foundation и изучите основы.
Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS .
Python os.path.join: Руководство для начинающих
Метод Python os.path.join объединяет одно или несколько имен путей в один путь. Этот метод часто используется с такими методами операционной системы, как os.walk (), для создания окончательного пути к файлу или папке. os.path.join () автоматически добавляет любые необходимые косые черты в имя пути к файлу.
Как использовать Python os.path.join
Возможно, вы попали в лабиринт путей при работе с файлами в Python.
Для работы с файлами необходимо указать каталог, в котором находится файл.Это проще, чем кажется. Если вы не укажете правильный путь, ваша программа не будет работать.
В этом руководстве мы поговорим о os.path.join. Это метод, который объединяет компоненты пути к файлу в полный путь. Мы рассмотрим два примера, которые помогут вам начать работу с этим методом.
Что находится в пути к файлу?
Найдите свой Bootcamp Match
- Career Karma подойдет вам с лучшими техническими учебными курсами
- Получите эксклюзивные стипендии и подготовительные курсы
Путь к файлу — это последовательность имен файлов и папок.Эта последовательность имен приведет вас к определенному месту в операционной системе (ОС) вашего компьютера.
В качестве примера возьмем следующий путь:
Этот путь ведет к папке с названием «обучающие программы». Если бы мы хотели получить доступ к определенному файлу или каталогу в этой папке, мы могли бы указать на него, используя его имя файла:
/Users/James/tutorials/README.md
Вы можете записать эти пути к файлам вручную в Python. Это может быть непрактично. Здесь на помощь приходит os.path.join.
Что такое Python os.path.join?
os.path.join объединяет имена путей в один полный путь. Это означает, что вы можете объединить несколько частей пути в один вместо жесткого кодирования каждого имени пути вручную.
Чтобы использовать эту функцию, вам необходимо импортировать библиотеку os в свой код:
Давайте посмотрим на синтаксис метода os.path.join (). Функция os.path.join принимает список путей, которые вы хотите объединить в один:
os.path.join (path2, path3...)
path2, path3 и все последующие значения представляют пути, которые вы хотите объединить в одно имя.
path = os.path.join ("/ Users / James / tutorials", "index.html") print (path)
Этот код возвращает: /Users/James/tutorials/index.html. Метод os.path.join является продолжением указанного нами компонента абсолютного пути («/ Users / James / tutorials»). Добавляем index.html в конец пути.
Удобно, что метод os.path.join вставляет косые черты (которые называются «разделителями каталогов»), когда они необходимы.Это делает его более удобным способом комбинирования имен путей к файлам, чем их объединение вручную.
os.path.join Пример Python
Давайте напишем объединение имени файла «index.html» в папку «tutorials / web /». Этот файл находится в нашем текущем рабочем каталоге.
Мы начнем с импорта библиотеки os:
Затем мы получим наш текущий рабочий каталог, чтобы мы могли добавить к нему имя пути к нашему файлу:
Это вернет наш текущий рабочий каталог, то есть / Users / Джеймс / учебные пособия.Папка «tutorials» находится в домашнем каталоге нашего пользователя. Мы можем использовать эту информацию, чтобы добавить «tutorials / web» в конец нашего рабочего каталога:
web_tutorials = os.path.join (cwd, «tutorials / web») print (web_tutorials)
Этот код возвращает: / Users / James / tutorials / web. Наш код объединил наши компоненты имени пути в один. Между именами путей добавлена косая черта («/»). Этот путь относится к папке «Интернет» в нашем существующем пути.
Python os.path.join: список файлов
Давайте использовать os.path.join, чтобы вернуть полные пути ко всем файлам в папке. Мы собираемся перечислить все файлы в папке «Рабочий стол» нашей файловой системы. Эта папка находится в каталоге «/ Users / James /» на диске.
Начнем с импорта библиотеки ОС и определения каталога, в котором мы хотим выполнить поиск:
import os cwd = os.getcwd () desktop = os.path.join (cwd, "Desktop")
Этот код генерирует путь к файлу для папки Desktop относительно нашего текущего рабочего каталога.Затем мы можем использовать метод Python os.listdir () для получения списка всех файлов в этой папке:
files = os.listdir (desktop)
Этот метод возвращает список имен всех файлов, которые появляются в папке Desktop. Он не включает пути к файлам. Теперь, когда у нас есть этот список файлов, мы можем распечатать их все на консоли. Мы собираемся распечатать полный путь к каждому файлу, используя os.path.join и цикл Python for:
для f в файлах: печать (os.path.join (desktop, f))
Этот код просматривает все файлы в папке Desktop. Он объединяет имя каждого файла с именем пути к папке рабочего стола. Наш код возвращает:
/Users/James/Desktop/.DS_Store /Users/James/Desktop/Notes.md /Users/James/Desktop/To-dos.md
На моем рабочем столе есть три файла: .DS_Store, Notes.md и To-dos.md. Мы использовали os.path.join () для генерации полных путей к каждому файлу.
Заключение
The os.path.Метод join объединяет компоненты в имени пути для создания полного имени пути.
Этот метод упрощает объединение двух или более компонентов имени пути. Os.path.join автоматически вставляет косую черту («/») в имя пути, когда это необходимо.
Если вы хотите узнать больше о языке программирования Python, ознакомьтесь с нашим руководством «Как выучить Python».
Использование пакетов ОС и Glob Python для управления путями к файлам | Наука о данных о Земле
Цели обучения
- Используйте earthpy для загрузки файлов с URL (адреса в Интернете).
- Используйте glob для получения настраиваемых списков файлов или каталогов.
- Используйте различные функции в пакете os для управления путями к файлам.
Для многих проектов с данными может быть полезно манипулировать и анализировать пути к файлам и каталогам, особенно если вы хотите получить программный доступ к файлам данных и автоматизировать рабочие процессы.
Чтобы начать работу с путями к файлам и каталогам в Python , вам сначала понадобятся файлы! На этой странице вы сначала узнаете, как использовать пакет earthpy для загрузки файлов с URL-адреса (интернет-адреса).
Затем вы будете использовать пакеты os и glob для доступа к файлам и каталогам и для создания списков путей, которые можно анализировать для извлечения полезной информации из имен файлов и каталогов.
Загрузка файлов с помощью EarthPy
Функцию data.get_data ()
из пакета earthpy можно использовать для загрузки данных из онлайн-источников, таких как репозиторий данных Figshare.com .
Начните с импорта необходимых пакетов: os , glob и earthpy (используя псевдоним et
).
# Импортировать необходимые пакеты
импорт ОС
from glob import glob
импортировать earthpy as et
Чтобы использовать функцию et.data.get_data ()
, вы можете предоставить значение параметра для url
, которое вы определяете, предоставляя текстовую строку URL-адреса (интернет-адреса) для набора данных.
# Загрузить данные о среднемесячной температуре для двух сайтов в Калифорнии
file_url = "https://ndownloader.figshare.com/files/21894528"
et.data.get_data (url = file_url)
Загрузка с https: // ndownloader.figshare.com/files/21894528
Извлеченный вывод в / root / earth-analytics / data / earthpy-downloads / avg-month-temp-fahr
'/ root / earth-analytics / data / earthpy-downloads / avg-month-temp-fahr'
По умолчанию et.data.get_data ()
загрузит файлы в earth-analytics / data / earthpy-downloads
в ваш домашний каталог и создаст необходимые каталоги, если они еще не существуют.
С помощью этой информации вы можете установить рабочий каталог в свой каталог earth-analytics
, а затем создать относительный путь к каталогу загруженных данных.
# Установить рабочий каталог на earth-analytics
os.chdir (os.path.join (et.io.HOME, "земля-аналитика"))
# Создаем путь к папке с данными
data_folder = os.path.join ("данные", "earthpy-downloads",
"avg-month-temp-fahr")
Glob в Python
glob — это мощный инструмент в Python, помогающий управлять файлами и фильтровать их. В то время как os помогает управлять и создавать определенные пути, удобные для любой машины, на которой они используются, glob помогает фильтровать большие наборы данных и извлекать только те файлы, которые представляют интерес.
Функция glob ()
использует правила оболочки Unix, чтобы помочь пользователям организовать свои файлы. Оболочка Unix следует довольно простым правилам поиска элементов, которые вы изучите ниже.
Поиск определенной папки или файла
Функцию glob
можно использовать для поиска только одной папки или файла. Это можно сделать, просто указав glob
путь к предмету, который вы пытаетесь найти.
# Получить конкретный каталог
file_list = glob (папка_данных)
file_list
['data / earthpy-downloads / avg-month-temp-fahr']
Это не очень полезно, так как у вас уже есть путь к данным, если вы используете его для поиска чего-либо.
Обратите внимание, что glob
возвращает список всех элементов, соответствующих вашему запросу, а не в виде отдельных строк.
Вы также можете использовать функцию glob ()
в сочетании с функцией os.path.join ()
для создания списков путей, которые строятся программно.
# Создать список, содержащий определенное имя файла
glob (os.path.join (папка_данных, 'Сан-Диего', 'Сан-Диего-1999-temp.csv'))
['data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-1999-temp.csv ']
*
Оператор
glob
использует разные операторы для расширения возможностей поиска. Основной оператор — *
.
*
— это своего рода подстановочный знак, который можно использовать для поиска элементов, имена которых отличаются друг от друга. Любой текст, который не соответствует, можно заменить на *
.
Например, если вы хотите, чтобы каждый файл в каталоге возвращался вам, вы можете поместить *
в конец пути к каталогу.
glob
вернет список всех файлов в этом каталоге.
# Получить список всех файлов / каталогов в папке данных
glob (os.path.join (папка_данных, '*'))
['data / earthpy-downloads / avg-month-temp-fahr / Sonoma',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego']
# Получить список всех файлов / каталогов в папке San-Diego
glob (os.path.join (папка_данных, 'Сан-Диего', '*'))
['data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2000-temp.csv ',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2003-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2001-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2002-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-1999-temp.csv']
Если вам нужно только файлов .csv
, то * .csv
вернет все файлы, которые заканчиваются на .csv
.
# Получить только файлы csv
glob (ос.path.join (папка_данных, 'Сан-Диего', '* .csv'))
['data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2000-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2003-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2001-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2002-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-1999-temp.csv']
Если вам нужен только .csv
с номером 2
где-нибудь в имени файла, чем * 2 * .csv
вернет этот список.
# Использовать несколько подстановочных знаков
glob (os.path.join (папка_данных, 'Сан-Диего', '* 2 * .csv'))
['data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2000-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2003-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2001-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2002-temp.csv ']
Обратите внимание, что 2 * .csv
вернет только файлы, которые начинаются с с номера 2
.
# Создать пустой список (имена файлов не начинаются с 2)
glob (os.path.join (папка_данных, 'Сан-Диего', '2 * .csv'))
Дополнительная звездочка перед 2
(например, * 2 * .csv
) позволяет 2
находиться в любом месте пути.
*
предназначен для замены всего текста, который не имеет значения для вашего поиска.
Рекурсивный поиск
Если вы пытаетесь работать с файлами в нескольких каталогах, вы можете использовать несколько *
в пути к файлу, чтобы указать, что вам нужен каждый файл во всех папках в каталоге.
Первый *
предназначен для доступа ко всем каталогам в начальном каталоге (например, data_folder
).
Затем следует второй оператор *
, который просматривает все подкаталоги, чтобы составить список всего их содержимого.
# Рекурсивный поиск в обеих папках сайта
glob (os.path.join (папка_данных, '*', '*'))
['data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-2002-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-2003-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-1999-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-2001-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-2000-temp.csv ',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2000-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2003-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2001-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2002-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-1999-temp.csv']
Сортировка
glob
Списки
Обратите внимание, что списки, предоставленные glob
, не отсортированы.
# Получить список CSV в каталоге Sonoma
sonoma_files = glob (os.path.join (папка_данных, 'Sonoma', '* .csv'))
sonoma_files
['data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-2002-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-2003-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-1999-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-2001-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-2000-temp.csv ']
Если важно, чтобы список располагался в определенном порядке, всегда проверяйте сортировку списка, возвращаемого glob
с помощью метода .sort ()
для списков.
# Сортировать глобальный список
sonoma_files.sort ()
# Другой вариант сортировки списков
sonoma_files = sorted (glob (os.path.join (data_folder, 'Sonoma', '* .csv')))
sonoma_files
['data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-1999-temp.csv ',
'data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-2000-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-2001-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-2002-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-2003-temp.csv']
Обратите внимание, что сортировка иногда может работать иначе, чем вы думаете, поэтому проверьте отсортированный список, прежде чем продолжить работу над проектом.
Например, если два элемента имеют одинаковые пути, но один заканчивается на 10
, а другой на 1
, иногда файл, заканчивающийся на 10
, будет помещен над файлом, заканчивающимся на 1
.Всегда проверяйте дважды!
Зачем сортировать списки
glob
?
Порядок, в котором glob
возвращает файлы из папки, может сильно различаться. В зависимости от используемой операционной системы или способа хранения файлов разные люди могут получать результаты из списка glob
в разном порядке.
Это может привести к ошибкам данных при выполнении проектов на разных компьютерах.
Например, рассмотрим, как сортировка списка glob
изменяет файлы, к которым вы обращаетесь при получении индекса из списка, например index [4]
для доступа к 5-му элементу в списке.
unsorted_sonoma = glob (os.path.join (папка_данных, 'Sonoma', '*'))
печать (unsorted_sonoma [4])
data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-2000-temp.csv
# Индексы меняются после сортировки списка!
sorted_sonoma = glob (os.path.join (папка_данных, 'Sonoma', '*'))
sorted_sonoma.sort ()
печать (sorted_sonoma [4])
data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-2003-temp.csv
Использование диапазонов
Помимо использования *
, чтобы указать, какие части имени файла важны для вас, вы можете использовать []
, чтобы указать диапазон символов для поиска.
Например, вы можете создать поиск для всех файлов с 2001 по 2003 в имени, используя * 200
и добавив к нему [1-3] *
.
# Получить файлы за 2001-2003 гг.
glob (os.path.join (папка_данных, '*', '* 200 [1-3] *'))
['data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-2002-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-2003-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-2001-temp.csv ',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2003-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2001-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2002-temp.csv']
Это не ограничивается только числами. [d-q]
также отфильтрует результаты для символов между буквами d
и q
.
Обратите внимание, однако, что этот диапазон поиска предназначен только для символов, а не для строк.
Например, вы можете искать номера 2-7 с помощью [2-7]
, но вы не сможете искать номера [2-14]
, потому что 14
— это более одного символа.
Обратите внимание, что поиск работает некорректно, поскольку [2001-2003]
содержат более одного символа.
# Получить неверный диапазон для 2002-2003 гг.
glob (os.path.join (папка_данных, '*', '* [2001-2003] *'))
['data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-2002-temp.csv ',
'data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-2003-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-1999-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-2001-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-2000-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2000-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2003-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2001-temp.csv ',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2002-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-1999-temp.csv']
?
Оператор
? Оператор
работает аналогично оператору *
, но используется для одного символа.
Если один символ в имени файла может быть переменным, но все остальное должно оставаться неизменным, то чем ?
— хороший способ просто заменить этот символ.
#? оператор, используемый для последнего значения в году
glob (os.path.join (папка_данных, 'Sonoma', '* 200? -temp.csv'))
['data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-2002-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-2003-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-2001-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-2000-temp.csv']
?
не ограничивается одним использованием за один поиск и может использоваться для замены более чем одного символа в запросе.
# Несколько? операторы
glob (os.path.join (папка_данных, 'Sonoma', '* 19 ?? - temp.csv'))
['data / earthpy-downloads / avg-month-temp-fahr / Sonoma / Sonoma-1999-temp.csv']
Сохранение вывода
glob
в переменную
Чтобы использовать вывод glob
позже в сценарии, обязательно сохраните его в переменной! Это легко сделать, просто назначив функции glob
output имя переменной.
sd_data = glob (os.path.join (папка_данных, 'Сан-Диего', '*'))
sd_data.sort ()
sd_data
['data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-1999-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2000-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2001-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2002-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2003-temp.csv ']
os
Расширенная функциональность
os
— еще один очень мощный инструмент, обладающий дополнительными функциями, которые могут быть полезны при работе с путями к файлам, например расширенными возможностями синтаксического анализа.
Например, os.path.normpath ()
— отличный способ очистить пути к файлам. Удаляются все ненужные символы, чтобы путь читался легче.
Это хороший способ убедиться, что ваш путь правильно отформатирован, прежде чем использовать другие функции os
на пути.
# Пример пути очистки нормального пути
example_path = "главная // пользователь // example_dir"
os.path.normpath (example_path)
os.path.commonpath ()
очень полезен в сочетании с glob
. Эта функция возьмет список путей к файлам и найдет самый низкий каталог, который есть у всех файлов.
Итак, если было два файла, один хранится в home / user / dir / dir2 / example.txt
, а другой — в home / user / dir / example.txt
, тогда os.path.commonpath ()
вернет home / user / dir
, поскольку это самый низкий общий каталог для двух общих папок.
# Распечатать список файлов
sd_data
['data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-1999-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2000-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2001-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2002-temp.csv ',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2003-temp.csv']
# Получить общий каталог из списка файлов
os.path.commonpath (sd_data)
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego'
os.path.basename ()
находит последний раздел пути и возвращает его. Если указан путь к файлу, имя файла будет проанализировано и возвращено.
# Печатать нормализованный путь
Операционные системы.path.normpath (папка_данных)
'data / earthpy-downloads / avg-month-temp-fahr'
# Получить последнюю часть пути к файлу с базовым именем
os.path.basename (os.path.normpath (папка_данных))
os.path.split ()
разделит путь на две части:
- последняя часть пути.
- остаток пути.
Он возвращает тот же результат, что и os.path.basename ()
, с добавлением остальной части пути, который был пропущен как другой.
# Получить последнюю часть пути к файлу и оставшуюся часть пути
os.path.split (os.path.normpath (папка_данных))
('data / earthpy-downloads', 'avg-month-temp-fahr')
Затем вы можете использовать индексирование результата, чтобы получить каждый фрагмент разделенного пути.
os.path.split (os.path.normpath (папка_данных)) [0]
os.path.split (os.path.normpath (data_folder)) [1]
Манипуляции со строками
Напомним, что при создании пути к файлу с помощью os.path.join ()
, он правильно отформатирует строку пути к файлу, поэтому его можно использовать в любых операционных системах.
Обратите внимание, однако, что путь к файлу по-прежнему является строкой. Таким образом, вы можете анализировать пути к файлам, как строки, и извлекать из них информацию, которая может вам понадобиться для проекта.
.split ()
— это встроенная функция Python , которая разбивает строку на список строк на основе символа разделителя и может использоваться в сочетании с os.sep
, чтобы разделить каталоги в путях файлов на их базовые части. os.sep
— это значение данных, хранящееся в os
, которое возвращает символ, используемый для разделения компонентов имени пути, таких как имена каталогов или файлов. Это \
для Windows и /
для систем POSIX, таких как Mac или Linux.
# Разделить путь на части
file_path_list = data_folder.split (os.sep)
file_path_list
['data', 'earthpy-downloads', 'avg-month-temp-fahr']
В дополнение к встроенным функциям пути к файлам можно анализировать с помощью строки [start_index: end_index]
, как обычной строки.Это может помочь получить важную информацию из пути к файлу, например, дату.
# Распечатать список файлов
sd_data
['data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-1999-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2000-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2001-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2002-temp.csv',
'data / earthpy-downloads / avg-month-temp-fahr / San-Diego / San-Diego-2003-temp.csv ']
# Получить имя файла
год_путь = sd_data [0]
имя_файла = os.path.basename (год_путь)
печать (имя_файла)
# Разобрать дату по имени файла
год = имя_файла [10:14]
печать (год)
Обратите внимание, что диапазон включает первое значение индекса, но не второе значение индекса (например, 1999
— это значения индекса с 10 по 13).
Подумайте, как можно использовать тот же синтаксис синтаксического анализа строк, чтобы получить имя сайта!
Теперь вы узнали основы glob и os для создания настраиваемых списков файлов и каталогов для управления и анализа имен файлов и каталогов, которые могут пригодиться в будущих проектах.
Написать код, который будет работать на любом компьютере: Введение в использование пакета Python для ОС для настройки рабочих каталогов и конструирования путей к файлам | Наука о данных о Земле
Цели обучения
- Используйте атрибут earthpy
et.io.HOME
, чтобы найти домашний каталог на любом компьютере. - Используйте
os.path.join ()
для создания путей, которые будут работать в Windows, Mac и Linux. - Используйте
os.path.exists ()
, чтобы убедиться, что путь к файлу существует. - Установите рабочий каталог в Python , используя
os.chdir ()
.
Для запуска кода на этой странице вам потребуются пакеты os и earthpy .
На этой странице ваша цель — создать и установить каталог earth-analytics в качестве рабочего каталога, используя код, который будет работать на любом компьютере.
Этот каталог earth-analytics должен существовать в вашем домашнем каталоге. Путь будет выглядеть примерно так: / home / user-name / earth-analytics
в соответствии с примером на предыдущей странице этой главы.
Чтобы создать и сконструировать этот рабочий каталог, вы будете использовать несколько функций, расположенных в пакете os Python . Вы также будете использовать пакет earthpy .
# Импортировать необходимые пакеты
импорт ОС
импортировать earthpy as et
Пути в Python
При настройке проектов на Python важно учитывать пути и рабочие каталоги. В идеальном случае ваш код может работать на любой машине.
Обеспечение того, чтобы ваш код мог работать на нескольких машинах, упрощает:
- настройку на тот редкий случай, когда ваша машина умирает.
- перенесите рабочий процесс в облачную среду или в инфраструктуру высокопроизводительных вычислений.
- поделитесь своим проектом и сотрудничайте с другими.
При создании траекторий следует учитывать несколько моментов, которые могут затруднить воспроизводимость.
Пути строятся по-разному в разных операционных системах. Например, путь к earth-analytics / data в домашнем каталоге, который вы изучили на предыдущем уроке, выглядит так в Python :
- / home / username / earth-analytics / data на Mac и Linux и
- C: \\ Users \\ username \\ earth-analytics \\ data в Windows
Заметные различия заключаются в идентификации домашнего каталога (например,грамм. / home / username
или C: \ Users \ username
), а также направление и количество косых черт.
Этот путь / home / username / earth-analytics / data
НЕ будет работать в Windows.
А этот путь C: \ Users \ username \ earth-analytics \ data
не будет работать на Mac или Linux.
К счастью для вас, есть набор функций, которые вы можете использовать для построения путей, которые обеспечат работу вашего кода на разных платформах. На этой странице вы узнаете, как эти функции помогают справиться с различиями в идентификации домашнего каталога и различиями в косых чертах между операционными системами.
Использование этих функций упростит вам совместную работу и обмен вашим кодом с другими (и даже с самим собой!) Независимо от операционной системы, которая используется для запуска кода.
Создание путей к каталогам, которые работают в разных операционных системах с использованием os.path.join
Модуль path в пакете os содержит функцию join ()
, которая создает путь из списка строк. Когда эта функция запускается, она адаптируется к операционной системе, которая вызывает Python .
os.path.join
принимает столько строк, сколько вы его предоставили. Он считывает каждую строку как имя каталога (или имя файла), а затем создает выходной путь, объединяя входные строки.
os.path.join ("dir1", "dir2", "dir3", "file-name")
В приведенном ниже примере создается относительный путь к подкаталогу data
внутри earth-analytics
каталог.
# Направление и количество косых черт обрабатываются функцией
Операционные системы.path.join ("земля-аналитика", "данные")
Функция join ()
из модуля os.path создает путь в формате, требуемом операционной системой, в которой выполняется код (т. Е. Какой бы операционной системой ни был запущен ваш компьютер).
Построение пути с помощью функции join ()
сэкономит ваше время, когда вы (или другие!) Переносите свой код на другой компьютер, поскольку вам не придется вручную создавать или исправлять пути.
ВАЖНО Используя этот подход, вы можете создавать пути, которых нет на вашем компьютере.Поэтому будьте осторожны с тем, чтобы убедиться, что вы создали необходимые каталоги, написали их правильно и что они находятся в правильном порядке в пути (то есть правильные родительские каталоги). os.path.join
на самом деле не проверяет, существует ли путь!
Поскольку вы потенциально можете создать путь, которого не существует на вашем компьютере, вы можете проверить его наличие с помощью функции os.path.exists ()
. Он возвращает логическое значение , равное True или False, в зависимости от того, действительно ли путь существует на вашем компьютере.
# Убедитесь, что на вашем компьютере существует каталог
my_path = os.path.join ("аналитика земли", "данные")
# Логический вывод (True или False)
os.path.exists (my_path)
В приведенном выше примере вы создали путь. Однако этот путь может уже существовать на вашем компьютере, а может и не существовать.
Если Python не может найти каталог, следует рассмотреть несколько проблем:
- Возможно, ваш рабочий каталог настроен неправильно, поэтому он может найти относительный путь.
- В вашем пути есть орфографическая ошибка. Или регистр (например, верхний, нижний) неправильный.
- Каталог не был создан на вашем компьютере.
Обратите внимание, что относительные пути вернут True только в том случае, если рабочий каталог был установлен правильно. Это потому, что относительные пути (как указано в названии) относятся к некоторому каталогу. Таким образом, вы хотите установить рабочий каталог в качестве отправной точки для относительных путей, которые вы хотите встроить в свой код.
В приведенном выше примере относительный путь возвращает False, поскольку рабочий каталог еще не установлен.
Проверка и установка рабочего каталога с помощью ОС
Вы можете использовать пакет os для проверки и установки рабочего каталога. Это еще одна хорошая проверка, которую следует реализовать, когда вы получаете в своем коде ошибку «файл не найден».
В пакете os есть две функции, которые помогут вам выполнить эти задачи:
-
getcwd ()
: CWD означает текущий рабочий каталог. Эта функция позволяет вам увидеть ваш текущий рабочий каталог. -
chdir ("path-to-dir")
: сокращение от CH ange DIR ectory, эта функция позволяет вам установить текущий рабочий каталог на путь по вашему выбору.
Проверьте текущий рабочий каталог
Проверьте текущий рабочий каталог с помощью os.getcwd ()
. Как выглядит результат?
В приведенном ниже примере вы можете увидеть пример вывода с компьютера, который используется для записи этого урока, который вы читаете (который находится в файле Jupyter Notebook !).
Заметили ли вы какие-либо характеристики этого пути, которые могут затруднить его запуск на другом компьютере?
os.getcwd ()
Вывод / home / username / Documents / github / earth-analytics-classes
- В указанном выше пути указано конкретное имя пользователя.
- Он также имеет подкаталоги, включая Documents и github , которые могут находиться или не находиться на другом компьютере.
- Наконец, есть косые черты, которые создают этот путь.Обратите внимание, что эти косые черты могут работать на Mac, но могут не работать в Windows.
Этот рабочий каталог может быть проблематичным как для вас, так и для других, поскольку он может не работать на других машинах.
Используйте атрибут earthpy HOME для определения вашего домашнего каталога
Вы можете установить рабочий каталог с помощью os.chdir ()
в ваш домашний каталог.
Это может решить некоторые из ваших проблем, если каталог earth-analytics
, который вы хотите использовать, существует в вашем домашнем каталоге (помните, что все компьютеры имеют домашний каталог).
Так что насчет использования os.chdir ("~ /")
?
Приведенный выше синтаксис имитирует то, что вы могли бы использовать в Bash для перехода в ваш домашний каталог; однако этот синтаксис, к сожалению, не работает в Python .
Вместо этого вы можете использовать модуль io из пакета earthpy , который содержит атрибут HOME , который определяет местонахождение вашего домашнего каталога.
# Найдите свой домашний каталог
et.io. ГЛАВНАЯ
При звонке по телефону et.io.HOME
, он предоставляет вам путь, который является путем к домашнему каталогу на вашем компьютере.
В этом пути будет учитываться любая операционная система, в которой он запущен, поэтому он будет работать на любом компьютере.
Вы можете убедиться, что каталог, возвращаемый et.io.HOME
, существует, используя os.path.exists ()
.
В приведенном ниже примере атрибут HOME предоставляется в качестве входных данных для функции os.path.exists
. Он возвращает логическое значение , равное True, что означает, что путь действительно существует на вашем компьютере.
# Проверить, существует ли домашний каталог (конечно, есть!)
os.path.exists (et.io.HOME)
В оставшейся части этого учебника вы будете использовать атрибут HOME из earthpy , чтобы установить рабочий каталог как домашний каталог.
После этого вы сможете получить доступ к файлам и подкаталогам в каталоге earth-analytics , который должен находиться в вашем домашнем каталоге на вашем компьютере.
Постройте путь к каталогу earth-analytics в вашем домашнем каталоге
Теперь вы реализуете несколько полезных приемов, чтобы построить путь к каталогу earth-analytics в вашем домашнем каталоге с помощью et.io.HOME
и os.path.join
.
Этот путь должен работать на любой машине независимо от операционной системы, поскольку он создается «на лету» Python .
# Создайте путь к каталогу home / earth-analytics на вашем компьютере
os.path.join (et.io.HOME, "земля-аналитика")
Вы можете проверить, действительно ли путь существует. Если путь не существует, вы получите False
.
Например, если у вас еще не было каталога earth-analytics
в вашем домашнем каталоге, то на выходе будет False
, как показано ниже.
my_ea_path = os.path.join (et.io.HOME, "земля-аналитика")
# Путь существует?
os.path.exists (my_ea_path)
Возвращает:
False
В этом примере каталог earth-analytics
не существует в вашем домашнем каталоге, но вы можете создать этот каталог с помощью модуля os !
Создание каталога с помощью пакета os в Python
Вы можете использовать функцию os.mkdir («путь / к / каталог / здесь»)
для создания каталога в Python .Эта функция полезна, если вам нужно создать новый каталог, который еще не существует.
Однако, как вы узнали выше, эта функция будет работать только в операционных системах, если вы создадите путь с помощью os.path.join ()
.
my_ea_path = os.path.join (et.io.HOME, "земля-аналитика")
os.mkdir (my_ea_path)
Обратите внимание, что приведенный выше код для создания каталога завершится ошибкой , если этот каталог уже существует.
В следующей главе этого учебника вы узнаете, как использовать условные операторы (называемые операторами , если
) для написания кода, учитывающего эту проблему, чтобы ваш код не пытался создавать каталоги, которые уже существуют.
Установите рабочий каталог на home / earth-analytics
Теперь, когда у вас есть основы хорошей структуры проекта, вы можете настроить каталог проекта.
К настоящему времени вы уже создали каталог earth-analytics
(в вашем домашнем каталоге), где вы будете хранить данные и файлы, используемые в учебнике.
Теперь вы установите этот каталог проекта в качестве рабочего каталога в Python , используя следующий синтаксис, который обеспечивает вывод os.path.join
в качестве входных данных в функцию os.chdir
:
os.chdir (os.path.join (et.io.HOME, 'earth-analytics'))
Нарушение приведенных выше команд , вы делаете следующее.
-
os.chdir ()
: помните, что эта функция изменяет рабочий каталог. Однако вам необходимо указать Python путь к рабочему каталогу, который вы хотите использовать. -
os.path.join ()
: эта функция объединяет строки или переменные пути в полный путь, который будет работать в любой операционной системе. -
et.io.HOME
: этот атрибут предоставляет путь к домашнему каталогу на вашем (или любом) компьютере.
Объединение трех приведенных выше команд во вложенной структуре:
- создаст путь для каталога
home / earth-analytics
, а - изменит рабочий каталог на этот путь.
Если вложенный характер приведенной выше команды кажется запутанным, вы можете разбить ее, выполняя каждый шаг по отдельности.
# Проверить текущий рабочий каталог
Операционные системы.getcwd ()
'/ корень / земля-аналитика-уроки'
# Найдите путь к вашему домашнему каталогу
et.io. ГЛАВНАЯ
# Создайте путь к аналитике Земли, который будет работать на любом компьютере
os.path.join (et.io.HOME, "земля-аналитика")
# Измените каталог на этот путь
os.chdir (os.path.join (et.io.HOME, 'earth-analytics'))
# Проверить текущий рабочий каталог еще раз
os.getcwd ()
Напомним, что если каталог еще не существует (например,грамм. earth-analytics
в вашем домашнем каталоге), то os.chdir ()
завершится ошибкой, когда вы попытаетесь перейти в этот каталог.
При необходимости вы можете просмотреть раздел выше о создании каталога с помощью os.mkdir ()
для создания каталога earth-analytics
в вашем домашнем каталоге.
6.5. Работа с каталогами
Пример 6.18. Каталоги списков
>>> os.listdir ("c: \\ music \\ _ singles \\") ['a_time_long_forgotten_con.mp3 ',' hellraiser.mp3 ', 'kairo.mp3', 'long_way_home1.mp3', 'sidewinder.mp3', 'spinning.mp3'] >>> dirname = "c: \\" >>> os.listdir (dirname) ['AUTOEXEC.BAT', 'boot.ini', 'CONFIG.SYS', 'cygwin', 'docbook', 'Документы и настройки', 'Входящие', 'Inetpub', 'IO.SYS', 'MSDOS.SYS', 'Музыка', 'NTDETECT.COM', 'ntldr', 'pagefile.sys', «Программные файлы», «Python20», «RECYCLER», "Информация о системном объеме", "TEMP", "WINNT"] >>> [f вместо f в os.listdir (имя каталога) ... если os.path.isfile (os.path.join (dirname, f))] ['AUTOEXEC.BAT', 'boot.ini', 'CONFIG.SYS', 'IO.SYS', 'MSDOS. SYS ', NTDETECT.COM, ntldr, pagefile.sys] >>> [f вместо f в os.listdir (имя каталога) ... если os.path.isdir (os.path.join (dirname, f))] ['cygwin', 'docbook', 'Документы и настройки', 'Входящие', Inetpub, Музыка, Программные файлы, Python20, RECYCLER, «Информация о системном томе», «TEMP», «WINNT»]
Функция listdir принимает путь и возвращает список содержимого каталога. | |
listdir возвращает файлы и папки, без указания того, какие именно. | |
Вы можете использовать фильтрацию списка и функцию isfile модуля os.path, чтобы отделить файлы от папок. isfile принимает путь и возвращает 1, если путь представляет файл, и 0 в противном случае.Здесь вы используете os.path.join, чтобы обеспечить полный путь, но isfile также работает с частичным путем относительно текущего рабочего каталога. Вы можете использовать os.getcwd (), чтобы получить текущий рабочий каталог. | |
os.path также имеет функцию isdir, которая возвращает 1, если путь представляет каталог, и 0 в противном случае. Вы можете использовать это, чтобы получить список подкаталогов в каталоге. |
Пример 6.19. Список каталогов в fileinfo.py
def listDirectory (каталог, fileExtList): "получить список объектов информации о файлах для файлов с определенными расширениями" fileList = [os.path.normcase (f) для f в os.listdir (каталог)] fileList = [os.path.join (каталог, f) для f в fileList если os.path.splitext (f) [1] в fileExtList]
os.listdir (каталог) возвращает список всех файлов и папок в каталоге. | |
Перебирая список с помощью f, вы используете os.path.normcase (f) для нормализации регистра в соответствии с настройками операционной системы по умолчанию.normcase — небольшая полезная функция, которая компенсирует нечувствительность к регистру операционных систем, которые считают, что mahadeva.mp3 и mahadeva.MP3 — это один и тот же файл. Например, в Windows и Mac OS нормальный регистр преобразует все имя файла в нижний регистр; в UNIX-совместимых системах он вернет имя файла без изменений. | |
Снова перебирая нормализованный список с помощью f, вы используете os.path.splitext (f), чтобы разделить каждое имя файла на имя и расширение. | |
Для каждого файла вы видите, есть ли расширение в списке расширений файлов, которые вам нужны (fileExtList, который был передан в функцию listDirectory). | |
Для каждого файла, который вам нужен, вы используете os.path.join (directory, f), чтобы построить полный путь к файлу и вернуть список полных имен путей. |
Есть еще один способ получить содержимое каталога. Он очень мощный и использует подстановочные знаки, которые вы
может быть уже знаком с работой в командной строке.
Пример 6.20. Листинговые каталоги с глобусом
>>> os.listdir ("c: \\ музыка \\ _ синглы \\") ['a_time_long_forgotten_con.mp3', 'hellraiser.mp3', 'kairo.mp3', 'long_way_home1.mp3', 'sidewinder.mp3', 'spinning.mp3'] >>> import glob >>> glob.glob ('c: \\ music \\ _ singles \\ *. mp3') ['c: \\ music \\ _ singles \\ a_time_long_forgotten_con.mp3', 'c: \\ музыка \\ _ синглы \\ hellraiser.mp3', 'c: \\ музыка \\ _ синглы \\ kairo.mp3', 'c: \\ музыка \\ _ синглы \\ long_way_home1.mp3', 'c: \\ музыка \\ _ синглы \\ sidewinder.mp3', 'c: \\ музыка \\ _ синглы \\ крутится.mp3 '] >>> glob.glob ('c: \\ music \\ _ singles \\ s * .mp3') ['c: \\ music \\ _ singles \\ sidewinder.mp3', 'c: \\ музыка \\ _ синглы \\ spinning.mp3'] >>> glob.glob ('c: \\ music \\ * \\ *. mp3')
Как вы видели ранее, os.listdir просто берет путь к каталогу и перечисляет все файлы и каталоги в этом каталоге. | |
Модуль glob, с другой стороны, принимает подстановочный знак и возвращает полный путь ко всем файлам и каталогам, соответствующим подстановочному знаку.Здесь подстановочный знак — это путь к каталогу плюс «* .mp3», который будет соответствовать всем файлам .mp3. Обратите внимание, что каждый элемент возвращенного списка уже включает полный путь к файлу. | |
Если вы хотите найти все файлы в определенном каталоге, которые начинаются с «s» и заканчиваются «.mp3», вы тоже можете это сделать. | |
Теперь рассмотрим следующий сценарий: у вас есть музыкальный каталог с несколькими подкаталогами внутри него с расширением.mp3 файлы в каждом подкаталоге. Вы можете получить список всех тех, кто за один вызов glob, используя сразу два подстановочных знака. Один подстановочный знак — это «* .mp3» (для соответствия файлам .mp3), а один подстановочный знак — в самом пути к каталогу , чтобы соответствовать любому подкаталогу в c: \ music. Это безумная мощь, заключенная в одной обманчиво простой функции! |
Python | Присоединиться к списку как путь
Вы хотите присоединить список строк к пути в вашей конкретной операционной системе? Запоминание правильного разделителя путей может быть настоящей болью.К счастью, на помощь приходит метод os.path.join ()
!
Метод os.path.join ()
принимает один или несколько аргументов пути и возвращает конкатенацию аргументов пути с правильным разделителем каталогов в вашей операционной системе. Если вы хотите присоединиться к списку путей, вам нужно распаковать список в список аргументов. Например, os.path.join (* lst)
присоединится к списку ['c:', 'your', 'directory']
в строку пути 'c: // your / directory'
в среда Windows.
Синтаксис : os.path.join ( путь , * пути )
Описание : объединить один или несколько компонентов пути в путь
и * пути
. Объединяет компоненты пути, используя строку разделителя каталогов, хранящуюся в os.sep
. Если компонент представляет собой абсолютный путь, например 'c: \ user \ path'
, или букву диска, например 'c:'
, все предыдущие компоненты пути отбрасываются, и соединение продолжается с компонента абсолютного пути.(улучшено из документации)
Примеры : Давайте рассмотрим минимальный пример того, как вы можете присоединиться к пути, хранящемуся в списке Python.
импорт ОС p = ['c:', 'пользователь', 'путь', 'file.py'] печать (os.path.join (* p))
Результат — объединенный путь:
'c: пользователь \ путь \ file.py'
Код выполняет следующие шаги:
Вот что произойдет, если вы используете две буквы диска в компонентах пути:
импорт ОС печать (os.path.join ('c:', 'пользователь', 'd:', 'путь', 'file.py')) # d: путь \ file.py
Вторая буква диска d:
перезаписывает первую букву диска, и все предыдущие компоненты (относительно d:
) выбрасываются!
В случае, если список может быть пустым, распаковка пустого списка в функцию os.path.join ()
выдаст ошибку:
импорт ОС p = [] печать (os.path.join (* p)) '' ' Отслеживание (последний вызов последний): Файл "C: \ Users \ xcent \ Desktop \ code.py ", строка 13, впечать (os.path.join (* p)) TypeError: join () отсутствует 1 обязательный позиционный аргумент: 'path' '
Вы можете исправить это, используя следующий трюк:
os.path.join ('', * p)
Даже если список p
пуст, он все равно вернет пустой путь, избегая сообщения об ошибке. Этот трюк полезен во многих других сценариях, поэтому стоит увидеть его один раз.
Видеообзор оператора Asterisk (распаковка списков)
Куда идти дальше?
Хватит теории, пора практиковаться!
Чтобы добиться успеха в программировании, вам нужно выйти и решать реальные проблемы для реальных людей.Вот так легко можно получить шестизначный заработок. Так вы оттачиваете навыки, которые действительно нужны вам на практике. В конце концов, какой толк в теории обучения, которая никому не нужна?
Практические проекты — это как отточить пилу в кодировании!
Вы хотите стать мастером кода, сосредоточившись на практических проектах кода, которые действительно приносят вам деньги и решают проблемы для людей?
Тогда станьте внештатным разработчиком Python! Это лучший способ подойти к задаче улучшения ваших навыков Python, даже если вы полный новичок.
Присоединяйтесь к моему бесплатному вебинару «Как развить свои навыки работы с высоким доходом на Python» и посмотрите, как я развивал свой бизнес по программированию в Интернете, и как вы тоже можете это сделать — не выходя из собственного дома.