Windows上的Python os.path.join

Fra*_* E. 83 python windows path-manipulation

我正在尝试学习python并正在制作一个将输出脚本的程序.我想使用os.path.join,但我很困惑.根据文件,如果我说:

os.path.join('c:', 'sourcedir')
Run Code Online (Sandbox Code Playgroud)

我得到"C:sourcedir".根据文档,这是正常的,对吧?

但是当我使用copytree命令时,Python会以所需的方式输出它,例如:

import shutil
src = os.path.join('c:', 'src')
dst = os.path.join('c:', 'dst')
shutil.copytree(src, dst)
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误代码:

WindowsError: [Error 3] The system cannot find the path specified: 'C:src/*.*'

如果我换行os.path.joinos.path.normpath我得到同样的错误.

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

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

And*_*asT 111

为了更加迂腐,最蟒蛇一致的答案将是:

mypath = os.path.join('c:', os.sep, 'sourcedir')
Run Code Online (Sandbox Code Playgroud)

因为你还需要os.sep作为posix根路径:

mypath = os.path.join(os.sep, 'usr', 'lib')
Run Code Online (Sandbox Code Playgroud)

  • 请原谅我的无知 - 看起来 Windows 和 Linux 之间的代码仍然不同,那么是什么让 `os.sep` 更胜一筹? (6认同)
  • 在注意尝试注入`os.sep`时请注意这个问题.它只适用于裸驱动器盘符后.>>> os.path.join("C:\ goodbye",os.sep,"temp")'C:\\ temp' (2认同)
  • @pianoJames 我的回答建立在这个基础之上,以提供一种与系统无关的解决方案:/sf/answers/3589331581/ (2认同)

小智 50

Windows对每个驱动器都有一个当前目录的概念.因此,"c:sourcedir"在当前C:目录中表示"sourcedir",您需要指定一个绝对目录.

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

"c:/sourcedir"
os.path.join("/", "c:", "sourcedir")
os.path.join("c:/", "sourcedir")
Run Code Online (Sandbox Code Playgroud)

  • os.path.join('C:/','sourcedir')按预期工作.我非常感谢你先生:)其他人'//''c:''c:\\'不起作用(C:\\创建了两个反斜杠,C:\根本没用)感谢ghostdog74 ,Smashery和Roger Pate.我欠你的债:) (7认同)
  • 所有这些解决方案都只是部分令人满意。当您有一个特定的情况时,可以手动添加分隔符,但如果您想以编程方式执行此操作,那么 `os.path.join('c:','folder')` 的工作标准是什么与 `os.path.join('folder','file')` 不同?是因为“:”还是因为“c:”是一个驱动器? (2认同)

Sma*_*ery 11

原因os.path.join('C:', 'src')是您没有按预期工作,因为您链接到的文档中包含以下内容:

请注意,在Windows上,由于每个驱动器都有一个当前目录,os.path.join("c:","foo")表示相对于驱动器C上当前目录的路径:(c:foo),而不是c :\ FOO.

正如鬼狗所说,你可能想要 mypath=os.path.join('c:\\', 'sourcedir')


Mat*_*all 10

要迂腐,将/或\作为路径分隔符进行硬编码可能并不好.也许这会是最好的?

mypath = os.path.join('c:%s' % os.sep, 'sourcedir')
Run Code Online (Sandbox Code Playgroud)

要么

mypath = os.path.join('c:' + os.sep, 'sourcedir')
Run Code Online (Sandbox Code Playgroud)


Sco*_*nte 7

对于在Windows和Linux上均可使用的与系统无关的解决方案,无论输入路径如何,都可以使用 os.path.join(os.sep, rootdir + os.sep, targetdir)

在Windows上:

>>> os.path.join(os.sep, "C:" + os.sep, "Windows")
'C:\\Windows'
Run Code Online (Sandbox Code Playgroud)

在Linux上:

>>> os.path.join(os.sep, "usr" + os.sep, "lib")
'/usr/lib'
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!这更有用,因为它不会受到@Jobu 前面提到的问题的困扰: os.path.join(os.sep, "C:\\a" + os.sep, "b") 返回 "C: \\a\\b" 在 Windows 上。 (2认同)
  • 但是,这些示例系统中的任何一个如何不可知?`c:` 在 *nix 上不存在,`usr` 在 Windows 上不存在.. (2认同)
  • 函数调用 `os.path.join(os.sep, rootdir + os.sep, targetdir)` 与系统无关_准确地说_是因为_它适用于这两个特定于系统的示例,而无需更改代码。 (2认同)
  • 这个解决方案,很像之前启发它的帖子,仍然依赖于设置 rootdir,如 `rootdir = "usr" if nix else "c:"`。但更直接和准确的 `rootdir = "/usr" if nix else "c:\\"` 也同样有效,没有 `os.sep` 杂技和随之而来的头疼。*nix 上的根目录不会以正斜杠以外的任何内容开头,或者 Windows 的根目录命名时不带尾随冒号和反斜杠(例如,在 Win shell 中,您不能只执行 `cd c: `,您需要指定结尾的反斜杠),那么为什么要假装不是呢? (2认同)

geo*_*org 6

我会说这是一个(windows)python错误。

为什么要臭虫?

我认为这句话应该是 True

os.path.join(*os.path.dirname(os.path.abspath(__file__)).split(os.path.sep))==os.path.dirname(os.path.abspath(__file__))
Run Code Online (Sandbox Code Playgroud)

但这是False在Windows机器上。

  • 我倾向于同意这构成了一个 Python 错误。现在还是这样吗?(_写自2015年底辉煌的乌托邦未来。_) (2认同)

gho*_*g74 5

要加入 Windows 路径,请尝试

mypath=os.path.join('c:\\', 'sourcedir')
Run Code Online (Sandbox Code Playgroud)

基本上,你需要逃避斜线