【发布时间】:2013-01-23 20:05:54
【问题描述】:
我想知道是否有更快的方法来实现在 python 中返回区分大小写的路径的函数。我想出的解决方案之一适用于 linux 和 windows,但需要我迭代 os.listdir,这可能很慢。
此解决方案适用于不需要足够速度的应用程序和上下文:
def correctPath(start, path):
'Returns a unix-type case-sensitive path, works in windows and linux'
start = unicode(start);
path = unicode(path);
b = '';
if path[-1] == '/':
path = path[:-1];
parts = path.split('\\');
d = start;
c = 0;
for p in parts:
listing = os.listdir(d);
_ = None;
for l in listing:
if p.lower() == l.lower():
if p != l:
c += 1;
d = os.path.join(d, l);
_ = os.path.join(b, l);
break;
if not _:
return None;
b = _;
return b, c; #(corrected path, number of corrections)
>>> correctPath('C:\\Windows', 'SYSTEM32\\CmD.EXe')
(u'System32\\cmd.exe', 2)
但是,当上下文从超过 50,000 个条目的大型数据库中收集文件名时,这将不会那么快。
一种方法是为每个目录创建一个字典树。将字典树与路径的目录部分匹配,如果发生键未命中,执行 os.listdir 为新目录查找并创建一个字典条目,并删除未使用的部分或保留变量计数器作为一种方法为每个目录分配一个“生命周期”。
【问题讨论】:
-
附带说明,PEP8 说您应该始终将您的文档字符串用三个双引号括起来,如下所示:
"""Returns a unix-type case-sensitive path, works in windows and linux""" -
另一个注意事项,在 Python 中,正斜杠在路径中有效,包括 Windows。因此,您始终可以在内部使用
/并仅在/当您在 Python 之外需要它时才呈现 `\`。 -
抱歉,还有一个注意事项。所有的分号是怎么回事?除非您将多个程序行放在单个文本行上,否则您实际上并不需要它们,即使那样,这也被认为是不好的做法。
-
我使用的数据库使用的是windows路径,所以我觉得不用太担心。我正在将元数据数据库从 Winamp 转换为 Rhythmbox。还要感谢文档字符串提示,没有人告诉我这些事情。还有关于分号的事情,我无能为力。如果我要发布我的程序,我保证我会删除它们。
-
听起来是个有趣的项目
标签: python linux windows path directory