【问题标题】:Case sensitive path comparison in pythonpython中区分大小写的路径比较
【发布时间】:2011-10-06 08:00:14
【问题描述】:

我必须检查文件是否存在于 Mac OS X 中的特定路径中。

目录中有一个名为 foo.F90 的文件。

但是当我执行if(os.path.exists(PATH_TO_foo.f90)) 时,它返回true,并且没有注意到f90 是小写的,而存在的文件是大写的F90。

我试过open(PATH_TO_foo.f90, "r"),即使这样也不行

我该如何解决这个问题?

【问题讨论】:

  • 您在处理区分大小写的文件系统吗?
  • 您能粘贴您收到的实际错误消息吗?我刚刚在 WinXP 上尝试过,它似乎工作正常。
  • 我在 Mac OSX 上运行它。所以,我认为它不区分大小写。如果我错了,请纠正我。
  • 我没有收到任何错误。但我想执行区分大小写的文件名比较。在这种情况下,当我尝试使用小写扩展名时,我希望它返回 False,因为这样的文件不存在。
  • 如果您正在使用的文件系统不区分大小写,那么当您访问这些文件时它不会在意。如果您仍想进行真正的比较,则可以比较路径的字符串文字,而不是使用os.path.exists

标签: python macos path comparison case-sensitive


【解决方案1】:

正如一些评论者所指出的,Python 并不真正关心不区分大小写的文件系统上路径中的大小写,因此路径比较或操作函数都不能真正满足您的需求。

但是,您可以使用os.listdir() 间接测试这一点,它确实为您提供了带有实际案例的目录内容。鉴于此,您可以使用以下内容测试文件是否存在:

'foo.f90' in os.listdir('PATH_TO_DIRECTORY')

【讨论】:

  • 如果存在文件夹嵌套并且需要在每个级别检查敏感度,这将不起作用,因为大小写不匹配可能在文件目录的父目录中。在这种情况下,需要在文件夹嵌套的每个级别应用上述检查
【解决方案2】:

这与您的底层操作系统有关,与 python 无关。例如,在 Windows 中,文件系统不区分大小写,而在 Linux 中,文件系统区分大小写。因此,如果我在基于 linux 的系统上运行与您运行相同的检查,我将不会得到不区分大小写的匹配 -

>>> os.path.exists('F90')
True
>>> os.path.exists('f90')
False                      # on my linux based OS

如果你真的想解决这个问题,你可以这样做 -

if 'f90' in os.listdir(os.path.dirname('PATH_TO_foo.f90')):
    # do whatever you want to do

【讨论】:

  • 如果您使用os.path.exists,Mac OS X 中的 Python 不区分大小写
【解决方案3】:

那么,既然你没有区分大小写的文件系统,那么

import os
if 'foo.F90' in os.listdir(PATH_TO_DIRECTORY):
    open(PATH_TO_DIRECTORY + 'foo.F90')

【讨论】:

    【解决方案4】:

    如果系统之间的路径发生变化或您可以使用的东西:

    import os, fnmatch
    
    for file in os.listdir('.'):
        if fnmatch.fnmatch(file, 'foo.*'):
            print file
    

    这将返回所有文件 foo。

    【讨论】:

      【解决方案5】:

      我认为这应该适合你 -

          import os  
      
          def exists(path):  
              import win32api  
              if path.find('/') != -1:  
                  msg = 'Invalid path for Windows %s'%path  
                  raise Exception(msg)  
              path = path.rstrip(os.sep)  
              try:  
                  fullpath = win32api.GetLongPathNameW(win32api.GetShortPathName(path))  
              except Exception, fault:  
                  return False  
              if fullpath == path:  
                  return True  
              else:
                  return False
      

      【讨论】:

        【解决方案6】:

        使用pathlib 为 Python 3.5+ 执行此操作的简单方法。适用于文件和目录:

        from pathlib import Path
        
        def exists_case_sensitive(path) -> bool:
            p = Path(path)
            if not p.exists():
                # If it already doesn't exist(), 
                # we can skip iterdir().
                return False
            return p in p.parent.iterdir()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-18
          • 2013-03-11
          • 2011-05-28
          • 1970-01-01
          相关资源
          最近更新 更多