Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows上的Python os.path.join_Python_Windows_Path Manipulation - Fatal编程技术网

Windows上的Python os.path.join

Windows上的Python os.path.join,python,windows,path-manipulation,Python,Windows,Path Manipulation,我正在尝试学习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.co

我正在尝试学习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)
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'))
以下是我得到的错误代码:

WindowsError: [Error 3] The system cannot find the path specified: 'C:src/*.*' WindowsError:[错误3]系统找不到指定的路径:“C:src/*.*” 如果我用
os.path.normpath
包装
os.path.join
,我会得到相同的错误

如果这个
os.path.join
不能以这种方式使用,那么我对它的用途感到困惑


根据Stack Overflow建议的页面,斜杠不应该用在join中,这是正确的,我假设?

要加入windows路径,请尝试

mypath=os.path.join('c:\\', 'sourcedir')

基本上,您需要转义斜杠,原因是os.path.join('C:','src')无法按预期工作,原因是您链接到的文档中的某些内容:

请注意,在Windows上,由于存在 每个驱动器的当前目录, join(“c:,“foo”)表示 相对于当前目录的路径 在驱动器C上:(C:foo),而不是C:\foo


正如ghostdog所说,您可能希望
mypath=os.path.join('c:\\','sourcedir')
Windows对每个驱动器都有一个当前目录的概念。因此,
“c:sourcedir”
表示当前c:dir目录中的“sourcedir”,您需要指定一个绝对目录

其中任何一个都可以工作,并给出相同的结果,但我目前没有启动Windows VM来进行双重检查:

"c:/sourcedir"
os.path.join("/", "c:", "sourcedir")
os.path.join("c:/", "sourcedir")

要学究式,硬编码或\作为路径分隔符可能不太好。也许这是最好的

mypath = os.path.join('c:%s' % os.sep, 'sourcedir')


更迂腐的是,最符合python文档的答案是:

mypath = os.path.join('c:', os.sep, 'sourcedir')
由于posix根路径也需要os.sep:

mypath = os.path.join(os.sep, 'usr', 'lib')
我认为这是一个(windows)python错误

为什么是臭虫

我认为这句话应该是正确的

os.path.join(*os.path.dirname(os.path.abspath(__file__)).split(os.path.sep))==os.path.dirname(os.path.abspath(__file__))
但是在windows机器上它是假的。

同意@georg-

我会说为什么我们需要lame
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上的路径,从最硬编码的方法(如使用原始字符串文字或转义反斜杠)到最少的方法。下面的几个示例将按预期工作。使用更适合你需要的东西

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

对于同时在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:“,”c:\\”不起作用(c:\\创建了两个反斜杠,c:\根本不起作用)

在windows上使用
os.path.join('c:','sourcedir')
将自动在sourcedir前面添加两个反斜杠
\\

要解析路径,由于python在windows上也使用正斜杠->'/',只需添加
。用
。如下所示加入
:-

os.path.join('c:\\','sourcedir')。替换('\\','/')

e、 g:
os.path.join('c:\\','temp')。replace('\\','/')


输出:'C:/temp'

建议的解决方案很有趣,提供了一个很好的参考,但它们只是部分令人满意。当您有一个特定的大小写或您知道输入字符串的格式时,手动添加分隔符是可以的,但是在某些情况下,您可能希望以编程方式在通用输入上添加分隔符

经过一点实验,我相信标准是,如果第一个段是驱动器号,即单个字母后跟冒号,则不添加路径分隔符,无论它是否对应于实际单位

例如:

import shutil
src = os.path.join('c:', 'src')
dst = os.path.join('c:', 'dst')
shutil.copytree(src, dst)
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

测试:

它可能会得到改进,以便对尾随空间更健壮,我只在windows上测试过它,但我希望它能提供一个想法。
有关windows以外系统的有趣详细信息,请参见。

os.path.join('C:/','sourcedir')按预期工作。我非常感谢你,先生:)其他的“/”,c:“'c:\\\”不起作用(c:\\创建了两个反斜杠,c:\根本不起作用)再次感谢ghostdog74,Smashery和Roger Pate。我欠你的债:)对不起,断线没有被保留在评论中,看起来很混乱。即使在某些情况下这样做有效,@AndreasT的回答是一个更好的解决方案。使用os.sep将根据操作系统的不同在/和\之间进行选择。如果要指定
c:
,使用
os.path.join
os.sep
有什么意义吗
c:
在其他操作系统上没有意义。所有这些解决方案都只是部分令人满意。当您有一个特定的案例时,手动添加分隔符是可以的,但是如果您想以编程方式添加分隔符,
os.path.join('c:','folder')
os.path.join('folder','file')的工作标准是什么?是因为
还是因为'c:`是一个驱动器?我倾向于认为这构成了一个Python bug。还是这样吗?(摘自2015年末辉煌的乌托邦未来)我无法回答有关windows的这个问题,因为我无法访问windows机器,但我猜python在这个问题上的行为没有改变。无论如何,对于LinuxImple来说,这句话也不是真的
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