如何在Python中同时在Linux和Windows中使用“/”(目录分隔符)?

259

我用Python编写了一段代码,在文件夹中使用“/”来创建一个特定的文件,如果我想在Windows中使用这个代码,它将无法工作,是否有一种方法可以在Windows和Linux中都使用这个代码。

我在Python中使用的是以下代码:

pathfile=os.path.dirname(templateFile)
rootTree.write(''+pathfile+'/output/log.txt')

当我在 Windows 机器上使用我的代码时,我的代码将无法正常工作。

如何在 Linux 和 Windows 中同时使用“/”(目录分隔符)?


1
你可以在开始时根据Win/*nix定义它,然后使用该变量。 - fedorqui
13
在Windows中,你可以使用 \ 或 / 作为目录分隔符。 - SecurityMatt
14
Windows支持在目录路径中使用正斜杠/。您遇到了什么具体问题?请发布一些演示问题的代码。 - Michael Geary
1
@MichaelGeary:只有有时候会失败,有时候不会。(只是根据经验说的,我不知道它在哪些情况下会失败,在哪些情况下不会。) - user541686
1
@Mehrdad:你知道一个例子,Win32 API不接受“/”吗?(不包括cmd.exe和其他程序) - Eryk Sun
显示剩余7条评论
11个回答

333
使用os.path.join()。 例如:os.path.join(pathfile,"output","log.txt")
在您的代码中,可以这样写:rootTree.write(os.path.join(pathfile,"output","log.txt"))

14
os.path.join 使用更复杂的逻辑将多个相对路径组件匹配在一起。当您只想要将它们链接在一起时,os.sep.join 是正确的选择。 - Bachsau
3
所以 os.sep 是分隔符字符串,感谢它带来的混淆。 - Richard Onslow Roper
是的,Richard,“os.sep”确实是Python运行的特定操作系统的分隔符字符串。 - xCovelus

167

使用:

import os
print os.sep

查看当前操作系统中分隔符的外观。
您可以在代码中使用以下内容:

import os
path = os.path.join('folder_name', 'file_name')

93
你可以使用 os.sep:
>>> import os
>>> os.sep
'/'

73

os.path.normpath(pathname)也应该被提及,因为它可以将路径分隔符/在Windows系统下转换成\。此外,它还可以消除冗余的上级引用......即A/BA/foo/../B以及A/./B都会变成A/B。如果你在使用Windows系统,这些路径都会变成A\B


7
根据问题的措辞,“如何在Linux和Windows中使用“/”(目录分隔符)”,我认为这是最好的答案。它也非常有用 - 当我需要指定一个长路径时,我更喜欢使用os.path.normpath('a/b/c/d/file.ext')而不是os.path.join('a','b','c','d','file.ext') - ukrutt
我也发现这个答案非常有帮助。我正在寻找一种生成具有一致分隔符的路径的方法。著名的 os.path.join 只是连接提供的任何内容。例如,join("a/b", "c\d") 在 Windows 上会得到 a/b\c\d。但是,通过适当组合 joinnormpath,我可以得到预期的结果,例如,在 Windows 上是 a\b\c\d - Anubis
我使用这个导入语句:from os.path import normpath as normpath # 给定 Windows 或 Linux 路径,修复路径分隔符以匹配当前操作系统。 然后我可以使用类似 normpath("a/b/c/d/e/f") 的东西,这似乎比任何其他替代方案更清晰。 - Contango

37

如果您足够幸运地使用Python 3.4+,您可以使用pathlib

from pathlib import Path

path = Path(dir, subdir, filename)  # returns a path of the system's path flavour

或者等价地说,

path = Path(dir) / subdir / filename

5
现在是2020年,因此这应该成为被接受的答案。Python开发人员添加了它以克服os中的问题,并使所有操作更加简便。例如 path.read_text(encoding="utf8")path.read_bytes()path.resolve()path.unlink()等。 - Douglas Myers-Turnbull

20

3
pathsep是路径分隔符,通常很有用,但在我看来这里并不需要。 - glglgl
2
@glglgl 的确。我查找了 sep 但还是忍不住发了这个帖子(我假设 OP 会在未来的工作中发现它有用):) - Maroun
1
@Maroun os.pathsep 是一个分号:;。建议进行编辑以删除它。 - Contango

13

执行 import os 然后使用 os.sep


12
你可以使用 "os.sep"。
 import os
 pathfile=os.path.dirname(templateFile)
 directory = str(pathfile)+os.sep+'output'+os.sep+'log.txt'
 rootTree.write(directory)

1
它也可以写成 os.path.sep - undefined

5

如果有人正在寻找这样的内容:

他/她想要知道父目录,然后进入子文件夹,可能还要进入特定的文件。如果是这样的话,我使用以下方法。

  1. 我现在使用的是Python 3.9版本。因此,在该版本中,我们可以使用os模块来处理此类任务。因此,要获取父目录:
parent_dir = os.path.pardir
  1. 不要硬编码文件路径分隔符(/或\),这是一种良好的编码实践。相反,使用上述os模块提供的操作系统相关机制。这使得您的代码非常适用于其他目的/人员。它可以像这样实现(只是一个示例):

path = os.path.pardir + os.sep + 'utils' + os.sep + 'properties.ini'

print(f'我的全局属性文件的路径是 :: {path}')

输出:

..\utils\properties.ini

您可以在此查看整个文档:https://docs.python.org/zh-cn/3/library/os.html


5
不要自己构建目录和文件名,使用Python的内置库。在这种情况下,相关的库是 os.path,特别是join函数可以从目录和文件名或目录中创建新的路径名,split函数可以从完整路径中获取文件名。
您的示例代码应该是:
pathfile=os.path.dirname(templateFile)
p = os.path.join(pathfile, 'output')
p = os.path.join( p, 'log.txt')
rootTree.write(p)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接