Я пытаюсь изучить 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: [Ошибка 3] Система не может найти указанный путь: 'C: src /*.*'
Если я обернуть os.path.join
с os.path.normpath
я получаю ту же ошибку.
Если это os.path.join
нельзя использовать таким образом, то я не понимаю его цель.
Согласно страницам, предложенным Stack Overflow, косые черты не должны использоваться в соединении - это правильно, я полагаю?
источник
os.path.join
илиos.sep
всеc:
равно оговаривать ?c:
не имеет смысла на других ОС.os.path.join('c:','folder')
работают иначеos.path.join('folder','file')
? Это потому,:
что 'c:' - это диск?Чтобы быть еще более педантичным, наиболее последовательным ответом на Python будет следующий:
mypath = os.path.join('c:', os.sep, 'sourcedir')
Так как вам также нужен os.sep для корневого пути posix:
mypath = os.path.join(os.sep, 'usr', 'lib')
источник
os.sep
лучше?os.sep
. Он работает только после пустой буквы диска. >>> os.path.join ("C: \ goodbye", os.sep, "temp") 'C: \\ temp'os.sep
полезен, когда вы хотите управлять путями, не делая предположений о разделителе. Бессмысленно использовать с,os.path.join()
так как он уже знает правильный разделитель. Это также бессмысленно, если вам нужно явно указать корневой каталог по имени (как вы можете видеть в своем собственном примере). Почему"c:" + os.sep
вместо того, чтобы просто"c:\\"
, илиos.sep + "usr"
вместо того, чтобы просто"/usr"
? Также обратите внимание, что в оболочках Win вы неcd c:
можетеcd c:\
, но можете , предполагая, что корневое имя на самом делеc:\
.Причина
os.path.join('C:', 'src')
не работает так, как вы ожидаете, из-за чего-то в документации, на которую вы ссылаетесь:Как сказал призрак, вы, вероятно, захотите
mypath=os.path.join('c:\\', 'sourcedir')
источник
Чтобы быть педантичным, вероятно, не стоит жестко указывать / или \ в качестве разделителя пути. Может, так будет лучше?
mypath = os.path.join('c:%s' % os.sep, 'sourcedir')
или
mypath = os.path.join('c:' + os.sep, 'sourcedir')
источник
Для независимого от системы решения, которое работает как в 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'
источник
c:
не существует в * nix иusr
не существует в Windows ..os.path.join(os.sep, rootdir + os.sep, targetdir)
зависит от системы именно потому, что он работает с обоими из этих системных примеров, без необходимости изменения кода.rootdir = "usr" if nix else "c:"
. Но более прямой и точныйrootdir = "/usr" if nix else "c:\\"
работает точно так же, безos.sep
акробатических трюков и, как следствие, царапин в голове. Нет опасности, что корневой каталог в * nix будет начинаться с чего-либо, кроме прямой косой черты, или что в Windows будут корневые каталоги, названные без конечного двоеточия и обратной косой черты (например, в оболочках Win вы не можете просто сделатьcd c:
, вы бы необходимо указать обратную косую черту в конце), так зачем же делать вид, что это не так?Я бы сказал, что это ошибка Python (Windows).
Почему глючит?
Я думаю это заявление должно быть
True
Но это
False
на машинах Windows.источник
чтобы присоединиться к пути Windows, попробуйте
mypath=os.path.join('c:\\', 'sourcedir')
в основном вам нужно избегать косой черты
источник
У вас есть несколько возможных подходов к обработке пути в 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
источник
Согласие с @ 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))
источник
отвечая на ваш комментарий: "другие '//' 'c:', 'c: \\' не работали (C: \\ создал две обратные косые черты, C: \ вообще не работал)"
В Windows при использовании
os.path.join('c:', 'sourcedir')
автоматически добавляются две обратные косые черты\\
перед sourcedir .Для того, чтобы определить путь, так как питон работает на окнах и с косой чертой -> «/» , просто добавьте
.replace('\\','/')
с ,os.path.join
как показано ниже: -os.path.join('c:\\', 'sourcedir').replace('\\','/')
например:
os.path.join('c:\\', 'temp').replace('\\','/')
вывод: 'C: / temp'
источник
Предлагаемые решения интересны и служат хорошим ориентиром, однако удовлетворяют лишь частично. Можно вручную добавить разделитель, если у вас есть один конкретный случай или вы знаете формат входной строки, но могут быть случаи, когда вы хотите сделать это программно для общих входов.
Немного поэкспериментировав, я считаю, что критерием является то, что разделитель пути не добавляется, если первый сегмент является буквой диска, то есть одной буквой, за которой следует двоеточие, независимо от того, соответствует ли она реальной единице.
Например:
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'))
Удобный способ проверить критерии и применить исправление пути может заключаться в использовании
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'))
его, вероятно, можно улучшить, чтобы он стал более устойчивым к конечным пробелам, и я тестировал его только в Windows, но я надеюсь, что это дает представление. См. Также Os.path: вы можете объяснить такое поведение? для получения интересных подробностей о других системах, кроме Windows.
источник