Разное

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 и выше.

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

  1. Файла прописанные в коде и в шаблонах, назовем их STATIC файлы.
  2. Файлы, который используются в коде, но известны только в процессе работы кода, назовем их 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 () и
базовое имя () .

ос.дорожка. раздельный привод ( путь )

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

В 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"

печать (os.path.join (путь, "Пользователь / Рабочий стол" , "file.txt" ))

путь = «Пользователь / документы»

печать (os.path.join (путь, "/ home" , "file.txt" ))

путь = "/ Пользователь"

печать (os.path.join (путь, "Загрузки" , "file.txt" , "/ home" ))

путь = "/ home"

print (os.path.join (path, "User / Public /" , "Documents" , ""))

Выход:

/ домашний / Пользователь / Рабочий стол / файл.текст
/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

Функция listdir принимает путь и возвращает список содержимого каталога.
listdir возвращает файлы и папки, без указания того, какие именно.
Вы можете использовать фильтрацию списка и функцию isfile модуля os.path, чтобы отделить файлы от папок. isfile принимает путь и возвращает 1, если путь представляет файл, и 0 в противном случае.Здесь вы используете os.path.join, чтобы обеспечить полный путь, но isfile также работает с частичным путем относительно текущего рабочего каталога. Вы можете использовать os.getcwd (), чтобы получить текущий рабочий каталог.
os.path также имеет функцию isdir, которая возвращает 1, если путь представляет каталог, и 0 в противном случае. Вы можете использовать это, чтобы получить список подкаталогов
в каталоге.

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), чтобы построить полный путь к файлу и вернуть список полных имен путей.

Как вы видели ранее, os.listdir просто берет путь к каталогу и перечисляет все файлы и каталоги в этом каталоге.
Модуль glob, с другой стороны, принимает подстановочный знак и возвращает полный путь ко всем файлам и каталогам, соответствующим подстановочному знаку.Здесь подстановочный знак — это путь к каталогу плюс «* .mp3», который будет соответствовать всем файлам .mp3. Обратите внимание, что каждый элемент возвращенного списка уже включает полный путь к файлу.
Если вы хотите найти все файлы в определенном каталоге, которые начинаются с «s» и заканчиваются «.mp3», вы тоже можете это сделать.
Теперь рассмотрим следующий сценарий: у вас есть музыкальный каталог с несколькими подкаталогами внутри него с расширением.mp3 файлы в каждом подкаталоге. Вы можете получить список всех тех, кто за один вызов glob, используя сразу два подстановочных знака. Один подстановочный знак — это «* .mp3» (для соответствия файлам .mp3), а один подстановочный знак — в самом пути к каталогу , чтобы соответствовать любому подкаталогу в c: \ music. Это безумная мощь, заключенная в одной обманчиво простой функции!