Python';Ubuntu上的s os.walk和区分大小写?

Python';Ubuntu上的s os.walk和区分大小写?,python,ubuntu-14.04,os.walk,Python,Ubuntu 14.04,Os.walk,我遇到了一个有点奇怪的情况,这让我有点困惑。我正在尝试对指定路径的所有子目录执行文件系统搜索。我希望返回结果,尊重用户对区分大小写或不区分大小写搜索的需求。这在Windows上似乎工作得很好,但在Python上运行相同的代码时让我有点头疼 为了进行测试,我将主应用程序的一些代码剥离为一小段python代码,如下所示: import sys import os src = sys.argv[1] caseSensitive = sys.argv[2] searchText = sys.argv[

我遇到了一个有点奇怪的情况,这让我有点困惑。我正在尝试对指定路径的所有子目录执行文件系统搜索。我希望返回结果,尊重用户对区分大小写或不区分大小写搜索的需求。这在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
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
如果我运行脚本并将其指向Foo目录,并告诉它对单词“Bu”进行区分大小写的搜索,那么它将在Windows上找到Buzz目录和Buzz.txt

如果我在Ubuntu上运行相同的代码段,它将不会返回任何结果,除非我忽略这个案例。当打印出os.walk()遇到的目录和文件名时,它会以小写形式打印所有目录和文件名。这可以部分解释为什么在Ubuntu上运行时搜索失败——它永远找不到匹配项,因为它将混合大小写“Bu”与“Bu”进行比较,而“Bu”不会注册为匹配项


长话短说:是我遗漏了什么,还是Ubunut上os.walk()的结果总是以小写形式返回?

事实证明,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在做什么,它都失败了。在我们的特定情况下,我们在任何给定时间都不会处理超过六个文件或目录,因此我们将其替换为以下内容:

Foo
  --bar
  --Fizz
     --Buzz
       --Buzz.txt
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上运行相同的代码时,它找不到它应该做的匹配


谢谢大家的帮助。

区分大小写
将是一个字符串,它永远不会等于
False
True
。顺便说一句,如果区分大小写==True:,您几乎永远都不想测试
是否区分大小写。
通常您只需要
如果区分大小写:
,那么任何真实的东西都很重要。当您明确想确保它只不过是
True
,而不是其他任何东西。如果区分大小写为True,您几乎总是希望
(因为除其他外,
1==True
是True)。有关更多详细信息,请参阅。无论如何,这种问题正是您希望查看
print
语句的输出并在此处发布输入和输出的原因,因为很多时候很难注意到自己代码中的明显内容。如果您看到
执行区分大小写的搜索。。。"尽管您使用了
False`作为参数,但很明显,只有前几行代码是相关的,因为在您进入os.walk位之前,事情已经搞砸了。看起来你们已经搞定了。当然,这仍然不能帮助我追踪生产中的错误,但至少是这样使我的示例应用程序正常工作。