我遇到了一个奇怪的情况,让我有点困惑。我正在尝试对指定路径的所有子目录执行文件系统搜索。我想返回结果,尊重用户对区分大小写或不区分大小写的搜索的需求。在Windows上运行Python似乎让我头疼。在
为了测试,我将主应用程序的一些代码剥离成一小段python代码,如下所示:
import sys
import os
src = sys.argv[1]
caseSensitive = sys.argv[2]
searchText = sys.argv[3]
if caseSensitive == False:
searchText = searchText.lower()
print "Case sensitive: " + caseSensitive
print "Src: " + src
print "Search text: " + searchText
fileCount = 0
directoryCount = 0;
if caseSensitive == True:
print "Performing case sensitive search..."
else:
print "Performing case insensitive search..."
for root, dirnames, filenames in os.walk(src):
for directory in dirnames:
if caseSensitive == True:
dMatch = directory
else:
dMatch = directory.lower()
print "D:" + dMatch
if dMatch.find(searchText) != -1:
print " **************dir match: " + dMatch
directoryCount = directoryCount + 1
for filename in filenames:
if caseSensitive == True:
fMatch = filename
else:
fMatch = filename.lower()
print "F:" + fMatch
if fMatch.find(searchText) != -1:
print " **************file match: " + fMatch
fileCount = fileCount + 1
print "Matching files: "
print fileCount
print "Matching directories: "
print directoryCount
这是一个有点粗糙的样本,但它至少给出了我在做什么的一个大概的概念。在
假设我有如下目录结构:
^{pr2}$如果我运行脚本并将其指向Foo目录,并告诉它对单词“Bu”进行区分大小写的搜索,那么在Windows上,它将找到Buzz目录并嗡嗡声.txt. 在
如果我在Ubuntu上运行同样的代码片段,它根本不会返回任何结果,除非我忽略这个情况。当打印出遇到的目录和文件名时手术室步行全部用小写()打印。这可以部分解释为什么在Ubuntu上运行时搜索失败-它永远找不到匹配项,因为它将混合大小写的“Bu”与“Bu”进行比较,后者不会注册为匹配项。在
长话短说:我是错过了什么,还是结果手术室步行()on Ubunut总是以小写形式返回?在
事实证明,这不是问题手术室步行完全(正如isedev和abarner指出的那样。问题出在生产代码中使用的库。在生产代码中,它执行以下操作:
我们看到的问题是,无论fmatch在做什么,它都失败了。在我们的特定情况下,我们在任何给定的时间处理的文件或目录都不会超过6个,因此我们将其替换为:
^{pr2}$不管出于什么原因,fnmatch库似乎并没有像我们想象的那样做。我们认为它应该做的是一种通配符风格的比较——至少在Windows上是这样。当Ubuntu在运行的时候,它不应该有相同的代码。在
谢谢你们的帮助,伙计们。在
相关问题 更多 >
编程相关推荐