python中ospathjoin_python-在Windows上与os.path.join混合斜杠

python-在Windows上与os.path.join混合斜杠

我倾向于只对路径('/')使用正斜杠,而python在Windows上也很满意。在os.path.join的描述中,它说的是跨平台使用的正确方法。 但是当我使用它时,我会得到混合的斜杠:

import os

a = 'c:/'

b = 'myFirstDirectory/'

c = 'mySecondDirectory'

d = 'myThirdDirectory'

e = 'myExecutable.exe'

print os.path.join(a, b, c, d, e)

# Result:

c:/myFirstDirectory/mySecondDirectory\myThirdDirectory\myExecutable.exe

它是否正确? 我应该稍后检查并更正它,还是有更好的方法?

谢谢

编辑:在询问路径时我也会得到斜杠

import sys

for item in sys.path:

print item

# Result:

C:\Program Files\Autodesk\Maya2013.5\bin

C:\Program Files\Autodesk\Maya2013.5\mentalray\scripts\AETemplates

C:\Program Files\Autodesk\Maya2013.5\Python

C:\Program Files\Autodesk\Maya2013.5\Python\lib\site-packages

C:\Program Files\Autodesk\Maya2013.5\bin\python26.zip\lib-tk

C:/Users/nookie/Documents/maya/2013.5-x64/prefs/scripts

C:/Users/nookie/Documents/maya/2013.5-x64/scripts

C:/Users/nookie/Documents/maya/scripts

C:\Program Files\Nuke7.0v4\lib\site-packages

C:\Program Files\Nuke7.0v4/plugins/modules

nookie asked 2020-01-12T07:56:59Z

6个解决方案

35 votes

您可以在path.join()之后使用.replace(),以确保斜杠正确无误:

# .replace() all backslashes with forwardslashes

print os.path.join(a, b, c, d, e).replace("\\","/")

这给出了输出:

c:/myFirstDirectory/mySecondDirectory/myThirdDirectory/myExecutable.exe

正如@sharpcloud所建议的,最好从输入字符串中删除斜杠,但这是另一种选择。

Maximus answered 2020-01-12T07:58:07Z

30 votes

现在,您自己提供一些斜线,让os.sep选择其他斜线。 最好让python选择所有它们,或者自己提供它们。 Python在路径的后半部分使用反斜杠,因为反斜杠是Windows上的默认设置。

import os

a = 'c:' # removed slash

b = 'myFirstDirectory' # removed slash

c = 'mySecondDirectory'

d = 'myThirdDirectory'

e = 'myExecutable.exe'

print os.path.join(a + os.sep, b, c, d, e)

我尚未对此进行测试,但希望对您有所帮助。 具有基本路径并且只需要联接另一个元素(通常是文件)是更常见的。

顺便说说; 您可以在需要运行python操作系统的最佳分隔符的那一刻使用os.sep。

编辑:如dash-tom-bang所示,显然对于Windows,您确实需要包括路径根的分隔符。 否则,您将创建相对路径,而不是绝对路径。

pyrocumulus answered 2020-01-12T07:57:38Z

10 votes

尝试使用abspath(使用python 3)

import os

a = 'c:/'

b = 'myFirstDirectory/'

c = 'mySecondDirectory'

d = 'myThirdDirectory'

e = 'myExecutable.exe'

print(os.path.abspath(os.path.join(a, b, c, d, e)))

输出:

c:\ myFirstDirectory \ mySecondDirectory \ myThirdDirectory \ myExecutable.exe

流程结束,退出代码为0

Andre Odendaal answered 2020-01-12T07:58:40Z

8 votes

根据评论编辑:import os

path = 'c:\www\app\my/folder/file.php'

# split the path to parts by either slash symbol:

path = re.compile(r"[\/]").split(path)

# join the path using the correct slash symbol:

path = os.path.join(*path)

我先前的答案缺乏处理转义字符的能力,因此不应使用:

首先,将路径转换为文件夹和文件名的数组。

其次,使用正确的符号将它们重新粘合在一起。

import os

path = 'c:\www\app\my/folder/file.php'

# split the path to parts by either slash symbol:

path = re.compile(r"[\/]").split(path)

# join the path using the correct slash symbol:

path = os.path.join(*path)

oriadam answered 2020-01-12T07:59:18Z

2 votes

sys.path为您添加斜杠,并确保不要重复斜杠,因此请在字符串中省略它们

import os

# Don't add your own slashes

a = 'C:'

b = 'myFirstDirectory'

c = 'mySecondDirectory'

d = 'myThirdDirectory'

e = 'myExecutable.exe'

print os.path.join(a, b, c, d, e)

C:\myFirstDirectory\mySecondDirectory\myThirdDirectory\myExecutable.exe

额外:

我不确定为什么您的sys路径中包含斜杠(您是否曾使用linux os添加一些文件夹?),但尝试检查一下

sys.path。

如果这是sys.path,则os适用于混合斜杠。

无论哪种方式,我都避免将目录名硬编码到您的程序中。 您的sys.path for循环是拉出这些目录的安全方法。 然后,您可以使用某些字符串方法,或使用正则表达式来选择所需的文件夹。

ejrb answered 2020-01-12T08:00:00Z

2 votes

如果出于任何原因需要自己提供路径,并且使用了python 3.4以上的版本,则可以使用pathlib

from pathlib import Path, PurePosixPath

a = PurePosixPath('c:/')

b = PurePosixPath('myFirstDirectory/')

c = 'mySecondDirectory'

d = 'myThirdDirectory'

e = 'myExecutable.exe'

print(a / b / c / d / e)

# Result

c:/myFirstDirectory/mySecondDirectory/myThirdDirectory/myExecutable.exe

当我需要用户提供资产目录的位置并且我的代码正在使用Windows路径字符串查找时,我使用了此方法

In [1]: from pathlib import Path, PureWindowsPath

In [2]: USER_ASSETS_DIR = Path('/asset/dir') # user provides this form environment variable

In [3]: SPECIFIC_ASSET = PureWindowsPath('some\\asset')

In [4]: USER_ASSETS_DIR / SPECIFIC_ASSET

Out[4]: PosixPath('/asset/dir/some/asset')

dinosaurwaltz answered 2020-01-12T08:00:25Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值