【问题标题】:Joining: string and absolute path with os.path加入:字符串和绝对路径与 os.path
【发布时间】:2011-06-24 09:42:06
【问题描述】:

为什么这不起作用,我做错了什么?

>>> p1 = r'\foo\bar.txt'
>>> os.path.join('foo1', 'foo2', os.path.normpath(p1))
'\\foo\\bar.txt'

我预料到了:

'foo1\\foo2\\foo\\bar.txt'

编辑:

解决方案

>>> p1 = r'\foo\bar.txt'
>>> p1 = p1.strip('\\') # Strip '\\' so the path would not be absolute 
>>> os.path.join('foo1', 'foo2', os.path.normpath(p1))
'foo1\\foo2\\foo\\bar.txt'

【问题讨论】:

  • 在我的 Python 上它按预期工作。
  • @rubik:你碰巧用过*nix吗?
  • @delnan:是的,我正在使用 Ubuntu

标签: python string path


【解决方案1】:

p1 是一个绝对路径(以 \ 开头) - 因此它根据文档自行返回:

join(a, *p)
    Join two or more pathname components, inserting "\" as needed.
    If any component is an absolute path, all previous path components
    will be discarded.

【讨论】:

  • 所以,要获得想要的结果,只需将第一行更改为p1 = r'foo\bar.txt'
  • 在这种情况下p1.strip('\\') 在 Linux 和 Windows 上是否同样有效?
  • @marw 如果您有其他类型的绝对路径(例如,以“/”开头,或在 Windows 上以“C:”之类的驱动器号开头),这将是不够的。例如,查看ntpath.join('foo', 'c:\\bar') 的结果
【解决方案2】:

os.path.join遇到绝对路径时,它会扔掉它积累到很远的东西。绝对字符串是以斜杠开头的字符串(在 Windows 上,带有一个 可选 驱动器号)。 normpath 不会触及那个斜线,因为它具有相同的绝对路径概念。你必须去掉那个斜线。

如果我可以问:它首先来自哪里?

【讨论】:

  • 我通过将需要广告的路径拆分到另一条路径来获得它。我正在尝试编写一个代码,该代码可以递归地将文件/目录从一个文件夹复制到另一个文件夹,但不是“实时”,而是通过创建一个 diles/dirs 列表,然后使用该列表创建文件。
【解决方案3】:

如果您希望os.path.join 的目标行为将两个绝对路径连接在一起,请去掉分隔符:

import os
p1 = os.path.join(os.sep, 'foo1', 'foo2')
p2 = os.path.join(os.sep, 'foo', 'bar.txt')

os.path.join(p1, p2.lstrip(os.sep))

如果你想修改路径,你也可以使用列表推导来做一些很酷的事情:

# Make sure all folder names are lowercase:
os.path.join(p1, *[x.lower() for x in p2.split(os.sep)])

【讨论】:

  • 我有理由确定 os.path.join(p1, p2.lstrip(os.sep)) 在 Windows 下会失败,因为每个路径都以驱动器说明符而不是 os.sep 为前缀。由于这两条路径可能位于不同的驱动器下,因此不清楚在 Windows 下应该做什么——这可能解释了为什么os.path.join() 默默地拒绝这样做是第一位的。
猜你喜欢
  • 2013-04-17
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 2014-11-24
  • 2012-01-11
相关资源
最近更新 更多