【问题标题】:Comparing two paths in python比较python中的两条路径
【发布时间】:2014-02-05 04:13:30
【问题描述】:

考虑:

path1 = "c:/fold1/fold2"
list_of_paths = ["c:\\fold1\\fold2","c:\\temp\\temp123"]

if path1 in list_of_paths:
    print "found"

我希望 if 语句返回 True,但它的计算结果为 False, 因为它是一个字符串比较。

如何比较两条路径而不考虑它们的正斜杠或反斜杠?我不希望使用replace 函数将两个字符串都转换为通用格式。

【问题讨论】:

    标签: python python-2.7 path


    【解决方案1】:

    将 list_of_paths 存储为列表而不是字符串:

    list_of_paths = [["c:","fold1","fold2"],["c","temp","temp123"]]
    

    然后用'/'或'\'(以存在者为准)分割给定路径,然后使用in关键字。

    【讨论】:

    • 嗨 Ashwin,我不确定哪个变量有什么斜线,因为两者都是动态生成的,我无法替换每个字符串,因为我会浏览大数据
    【解决方案2】:

    使用os.path.normpathc:/fold1/fold2 转换为c:\fold1\fold2

    >>> path1 = "c:/fold1/fold2"
    >>> list_of_paths = ["c:\\fold1\\fold2","c:\\temp\\temp123"]
    >>> os.path.normpath(path1)
    'c:\\fold1\\fold2'
    >>> os.path.normpath(path1) in list_of_paths
    True
    >>> os.path.normpath(path1) in (os.path.normpath(p) for p in list_of_paths)
    True
    
    • os.path.normpath(path1) in map(os.path.normpath, list_of_paths) 也有效,但即使中间有匹配项,它也会构建一个包含整个路径项的列表。 (在 Python 2.x 中)

    在 Windows 上,您必须使用 os.path.normcase 来比较路径,因为在 Windows 上,路径不区分大小写。

    【讨论】:

    • 并添加 os.path.normcase 以在 windows 上转换为小写 - 因为 windows 应该不区分大小写以进行比较。
    • 但是 OP 说任何地方都可能有任何斜线
    • @AswinMurugesh,感谢您的评论。我添加了一个可以处理这种情况的版本。
    • 在 windows 上还有一个问题:'c:\\users\\administrator\\foo.txt' 与 'c:\\users\\admini~1\\foo.txt' 是同一个文件。 txt' 感谢 8.3 文件名的跛脚。
    • 我认为您想使用os.path.realpath 来涵盖@cbare 提及的情况。
    【解决方案3】:

    在比较路径之前,使用os.path.normpath 规范化路径。例如:

    if any(os.path.normpath(path1) == os.path.normpath(p)
           for p in list_of_paths):
        print "found"
    

    【讨论】:

    • os.path.normpath 用于规范化路径,我们应该使用 os.path.realpath 进行规范化。
    • @baky 这取决于确切的要求。由于 OP 要求比较“无论正斜杠还是反斜杠”,normpath 满足。当然,OP 有可能在两年半前错误地陈述了他们的要求,但那只是猜测。
    【解决方案4】:

    os.path 模块包含多个函数来规范化文件路径,以便等效路径规范化为相同的字符串。您可能需要normpathnormcaseabspathsamefile 或其他一些工具。

    【讨论】:

    • +1 表示os.path.samefile(path1, path2)。使用它消除了在执行字符串比较之前使用 normpath()realpath()normcase()(在 Windows 操作系统上)的需要。但是,它需要两个路径都存在于文件系统上,否则将引发 FileNotFoundError 异常,并且它不会解析本地相对路径,例如~/Path/To/File,对于这些使用expanduser()。注意:Python 3.2 添加了对 Windows 操作系统的samefile() 支持。
    • +1 也适用于samefile 并且只是提一下:尽管名称“samefile”也允许检查目录!见docs.python.org/3/library/os.path.html
    【解决方案5】:

    所有这些答案都提到了os.path.normpath,但没有一个提到os.path.realpath

    os.path.realpath(path)

    返回指定文件名的规范路径,消除路径中遇到的任何符号链接(如果操作系统支持的话)。

    2.2 版中的新功能。

    那么:

    if os.path.realpath(path1) in (os.path.realpath(p) for p in list_of_paths):
        # ...
    

    【讨论】:

      【解决方案6】:

      如果你使用,你可以使用来实现你的目标:

      import pathlib
      path1 = pathlib.Path("c:/fold1/fold2")
      list_of_paths = [pathlib.Path(path) for path in ["c:\\fold1\\fold2","c:\\temp\\temp123"]]
      assert path1 in list_of_paths
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-06
        • 1970-01-01
        相关资源
        最近更新 更多