【问题标题】:How can you use os.chdir to go to a path minus the last step of it?你怎么能使用 os.chdir 去一个路径减去它的最后一步?
【发布时间】:2011-09-12 11:21:12
【问题描述】:

比如一个方法传入一个路径作为参数,这个路径可能是“C:/a/b/c/d”,如果我想用os.chdir()改成C:/ a/b/c(没有最后一个文件夹)? os.chdir() 可以接受“..”命令吗?

【问题讨论】:

  • “试试看”不是最可靠的方法,如果您想跨平台灵活使用。
  • 虽然取决于符号链接,但转到 d 再上一级可能与转到 c 的效果不同。
  • 头发,注意“..”不是命令;在所有符合 POSIX 的操作系统及其文件系统(是的,包括 MS Windows)中,所有目录都有一个名为“..”的有效条目(尽管有特殊代码来满足 chdir 来自/a/b/c.. 导致/a/b 作为当前工作目录,而不是/a/b/c/..,即使后者有效)。

标签: python operating-system


【解决方案1】:

os.chdir() 可以将'..' 作为参数,是的。但是,Python 提供了一种与平台无关的方式:通过使用 os.pardir:

os.chdir(os.pardir)

【讨论】:

    【解决方案2】:

    你可以使用os.path.dirname:

    In [1]: import os.path
    
    In [2]: os.path.dirname('C:/a/b/c/d')
    Out[2]: 'C:/a/b/c'
    

    edit:有人指出,如果路径以斜杠结尾,这不会删除最后一个组件。作为更强大的替代方案,我提出以下建议:

    In [5]: os.path.normpath(os.path.join('C:/a/b/c/d', '..'))
    Out[5]: 'C:/a/b/c'
    
    In [6]: os.path.normpath(os.path.join('C:/a/b/c/d/', '..'))
    Out[6]: 'C:/a/b/c'
    

    '..' 可以替换为os.path.pardir,以使代码更加可移植(至少理论上如此)。

    【讨论】:

    • 正如 Sven 在我回答这个问题时指出的那样:如果尾部有斜杠,此方法将失败。 os.path.dirname("/a/b/c/") == "/a/b/c".
    【解决方案3】:

    os.path module 有一些对这类事情有用的功能。

    os.path.normpath() 可用于将包含.. 等引用的路径转换为绝对路径。无论操作系统如何处理路径,这将确保一致的行为。

    os.chdir(os.path.normpath("C:/a/b/c/..")) 应该可以完成你想要的。

    【讨论】:

    • 小心尾随斜杠或反斜杠。
    • 呃。我在测试时注意到了这一点。更改为可行的解决方案。
    • os.path.normpath(os.getcwd() + os.sep + os.pardir) 会给你回一个
    猜你喜欢
    • 1970-01-01
    • 2015-02-11
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多