Windows上的Python os.path.join
我正在尝试学习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
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-
我会说为什么我们需要lameos.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