Python的步行操作系统Ubuntu的区分大小写呢?

2024-10-17 06:27:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我遇到了一个奇怪的情况,让我有点困惑。我正在尝试对指定路径的所有子目录执行文件系统搜索。我想返回结果,尊重用户对区分大小写或不区分大小写的搜索的需求。在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总是以小写形式返回?在


Tags: 代码src目录ifsyslower区分print
1条回答
网友
1楼 · 发布于 2024-10-17 06:27:56

事实证明,这不是问题手术室步行完全(正如isedev和abarner指出的那样。问题出在生产代码中使用的库。在生产代码中,它执行以下操作:

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

^{pr2}$

不管出于什么原因,fnmatch库似乎并没有像我们想象的那样做。我们认为它应该做的是一种通配符风格的比较——至少在Windows上是这样。当Ubuntu在运行的时候,它不应该有相同的代码。在

谢谢你们的帮助,伙计们。在

相关问题 更多 >