6

有没有一种简单的方法可以从全小写路径中获取“真正的”区分大小写的路径。就像 os.path.normcase 的反面一样。

例如,考虑目录:

c:\StackOverFlow

如果我有以下代码段,如何获取 d_real?

>>> import os
>>> d = os.path.normcase('C:\\StackOverFlow') # convert to lower case
>>> d
'c:\\stackoverflow'
>>> d_real = ... # should give 'C:\StackOverFlow' with the correct case
4

5 回答 5

1

您可以通过链接GetShortPathName和来做到这一点GetLongPathName。这在理论上是行不通的,因为您可以通过一些配置设置在 Windows 上禁用短文件名。下面是一些使用 ctypes 的示例代码:

def normcase(path):
    import ctypes
    GetShortPathName = ctypes.windll.kernel32.GetShortPathNameA
    GetLongPathName = ctypes.windll.kernel32.GetLongPathNameA
    # First convert path to a short path
    short_length = GetShortPathName(path, None, 0)
    if short_length == 0:
        return path
    short_buf = ctypes.create_string_buffer(short_length)
    GetShortPathName(path, short_buf, short_length)
    # Next convert the short path back to a long path
    long_length = GetLongPathName(short_buf, None, 0)
    long_buf = ctypes.create_string_buffer(long_length)
    GetLongPathName(short_buf, long_buf, long_length)
    return long_buf.value
于 2013-03-12T15:20:26.513 回答
1

我不会认为这个解决方案很简单,但你可以做的是:

import os
d = os.path.normcase('C:\\StackOverFlow')
files = os.listdir(os.path.dirname(d))
for f in files:
  if not d.endswith(f.lower()):
    continue
  else
    real_d = os.path.join(os.path.dirname(d), f)

它可能效率不高(取决于目录中的文件数量)。它需要对路径组件进行调整(我的解决方案实际上只更正了文件名的大小写,而不关心目录名)。此外,可能os.walk有助于遍历树。

于 2009-12-04T11:45:18.330 回答
1

仅使用标准库,此库适用于所有路径部分/子目录(驱动器号除外):

def casedpath(path):
    r = glob.glob(re.sub(r'([^:/\\])(?=[/\\]|$)', r'[\1]', path))
    return r and r[0] or path

这个还处理 UNC 路径:

def casedpath_unc(path):
    unc, p = os.path.splitunc(path)
    r = glob.glob(unc + re.sub(r'([^:/\\])(?=[/\\]|$)', r'[\1]', p))
    return r and r[0] or path
于 2016-02-05T17:20:38.783 回答
0

肮脏的黑客方法,

import glob
...
if os.path.exists(d):
    d_real = glob.glob(d + '*')[0][:len(d)]
于 2009-12-04T11:35:48.203 回答
-1

绝对丑陋,但很有趣:

def getRealDirPath(path):
    try:
        open(path)
    except IOError, e:
        return str(e).split("'")[-2]

当然:

  • 仅适用于目录
  • 如果由于其他原因无法打开 dir 将是错误的

但是,如果您不需要它来处理“生死攸关”的代码,它仍然很有用。

试图 grep 标准库以找到他们如何找到真实路径但找不到它。必须在 C 中。

那是当天的肮脏黑客,下次我们将在堆栈跟踪上使用正则表达式,只是因为我们可以:-)

于 2009-12-05T19:01:04.813 回答