我有点奇怪的情况让我有点难过。我正在尝试对指定路径的所有子目录执行文件系统搜索。我想返回结果,尊重用户对区分大小写或不区分大小写的搜索的期望。这似乎在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
这是一个粗略的样本,但至少可以大致了解我在做什么。
假设我有一个目录结构如下:
Foo
--bar
--Fizz
--Buzz
--Buzz.txt
如果我运行脚本并将其指向Foo目录,并告诉它对单词“Bu”进行区分大小写搜索,则在Windows上会找到Buzz目录和Buzz.txt。
如果我在Ubuntu上运行相同的代码段,它将不会返回任何结果,除非我忽略了这种情况。打印出os.walk()遇到的目录和文件名时,它会以小写形式打印出来。这可以部分解释为什么在Ubuntu上运行时搜索失败 - 它不会找到匹配,因为它将混合大小写“Bu”与“bu”进行比较,而不会将其注册为匹配。
长话短说:我错过了什么,或者Ubunut上os.walk()的结果总是以小写字母返回?
答案 0 :(得分:0)
事实证明,这根本不是os.walk的问题(正如isedev和abarnert所指出的那样。问题在于生产代码中使用的库。在生产代码中,它正在做类似以下的事情:
for root, dirnames, fileanmes in os.walk(src):
for filename in fnmatch.filter(filenames, '*' + searchText + '*'):
# If we are case insensitive, compare against a lowercase filename
for dirname in fnmatch.filter(dirnames, '*' + searchText + '*'):
# If we are case insensitive, compare against a lowercase dirname
我们看到的问题是因为无论fmatch做了什么,都失败了。在我们的特定情况下,我们在任何给定时间都没有处理超过六个文件或目录,因此我们将其替换如下:
for root, dirnames, filenames in os.walk(src):
for filename in filenames:
# Do comparison on all filenames, not some fancy filtered list
for dirname in dirnames:
# Do comparison on all dirnames, not some fancy filtered list
似乎无论出于何种原因,fnmatch库并没有完全按照我们的想法行事。我们认为应该做的是通配符风格比较 - 至少在Windows上是这样。在Ubuntu上运行相同的代码时,它没有找到它应该具有的匹配项。
感谢大家的帮助。