在Windows上的Python os.path.join
我正在学习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]系统找不到指定的path:'C:src /*.*'
如果我用os.path.normpath
包装os.path.join
,我得到相同的错误。
如果这个os.path.join
不能用这种方式,那么我对它的目的感到困惑。
根据Stack Overflowbuild议的页面,在连接中不应该使用斜线 – 这是正确的,我假设?
Windows有一个每个驱动器的当前目录的概念。 因此, "c:sourcedir"
在当前C:目录下的意思是“sourcedir”,你需要指定一个绝对目录。
任何这些应该工作,并给出相同的结果,但我现在没有启动一个Windows虚拟机来仔细检查:
"c:/sourcedir" os.path.join("/", "c:", "sourcedir") os.path.join("c:/", "sourcedir")
为了更迂腐,最python文件一致的答案是:
mypath = os.path.join('c:', os.sep, 'sourcedir')
由于您还需要os.sep作为posix根path:
mypath = os.path.join(os.sep, 'usr', 'lib')
os.path.join('C:', 'src')
不能正常工作,因为你链接到的文档中有这样的内容:
请注意,在Windows上,由于每个驱动器都有当前目录,因此os.path.join(“c:”,“foo”)代表相对于驱动器C上当前目录的path:(c:foo),而不是c :\ FOO。
正如鬼狗说的,你可能想要mypath=os.path.join('c:\\', 'sourcedir')
为了迂回,将硬编码或者\作为path分隔符可能并不好。 也许这会是最好的?
mypath = os.path.join('c:%s' % os.sep, 'sourcedir')
要么
mypath = os.path.join('c:' + os.sep, 'sourcedir')
join一个Windowspath,试试
mypath=os.path.join('c:\\', 'sourcedir')
基本上,你将需要逃避斜线
我会说这是一个(Windows)的Python的错误。
为什么错误?
我认为这个陈述应该是True
os.path.join(*os.path.dirname(os.path.abspath(__file__)).split(os.path.sep))==os.path.dirname(os.path.abspath(__file__))
但是在windows机器上是False
。
同意@ 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))
你有几种可能的方法来处理Windows上的path,从最硬编码的(如使用原始string文字或转义反斜杠)到最less。 这里有几个例子会按预期工作。 使用更适合您的需求的东西。
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