0

我的脚本记录有关目录和子目录中所有唯一文件类型的信息。在创建唯一的文件扩展名列表的过程中,当前代码认为 jpg、Jpg 和 JPG 是相同的,因此它只将其中一个包含在列表中。如何包含所有三个或更多差异?

for root, dirs, files in os.walk(SourceDIR, topdown=False):
    for fl in files:
        currentFile=os.path.join(root, fl)
        ext=fl[fl.rfind('.')+1:]
        if ext!='':
            if DirLimiter in currentFile:
                List.append(currentFile)
                directory1=os.path.basename(os.path.normpath(currentFile[:currentFile.rfind(DirLimiter)]))
                directory2=(currentFile[len(SourceDIR):currentFile.rfind('\\'+directory1+DirLimiter)])
                directory=directory2+'\\'+directory1
                if directory not in dirList:
                    dirCount+=1
                    dirList.append(directory)


        if ext not in extList:
          extList.append(ext)

完整的脚本在stackexchange上的这个问题中:Recurse through commands and log files by file type in python

感谢 JennaK 的进一步调查,我发现 jpg 报告中的输入实际上在文件中包含 JPG 和 jpg,如下所示。

> 44;X:\scratch\project\Input\Foreshore and Jetties Package
> 3\487679 - Jetty\IMG_1630.JPG;3755267
> 45;X:\scratch\project\Input\Foreshore and Jetties Package
> 3\487679 - Jetty\IMG_1633.JPG;2447135
> 1;X:\scratch\project\Input\649701 - Hill
> Close\2263.jpg;405328 2;X:\scratch\project\Input\649701 - Hill Close\2264.jpg;372770

所以它首先获取所有 JPG 文件的详细信息,然后是 jpg 文件并将它们放在一个报告中,这实际上比拥有 2 个报告更方便。我想我的编程比我想象的要好:-)

4

1 回答 1

2

不,对于listin运算符检查是否相等,并且字符串仅在使用相同大小写时才彼此相等。

您可以在这里使用一个集合,并将所有directory.lower()值存储在其中。对于成员资格测试,集合和列表也(很多)更快:

directories = set()
extensions = set()

for root, dirs, files in os.walk(SourceDIR, topdown=False):
    # ...
        # no need to use `directory.lower() in directories`, just update the set:
        directories.add(directory.lower())

    # ...
    extensions.add(ext.lower())

dirCount变量稍后很容易导出:

dirCount = len(directories)

您还想进一步研究os.path提供的函数,特别是os.path.splitext(),os.path.relpath()os.path.join()函数。

循环中的文件处理可以大大简化;A:

for fl in files:
    filename = os.path.join(root, fl)
    base, ext = os.path.splitext(filename)
    if ext:
       List.append(filename)
       directory = os.path.relpath(filename, SourceDir)
       directories.add(directory.lower())
       extensions.add(ext)

请注意,我只是 os.path.relpath()在这里使用;你的os.path.basename()os.path.normpath()舞蹈加上定界符等是不必要的复杂。

现在,从字里行间看,似乎您只想考虑扩展是相等的,无论那部分的情况如何。

在这种情况下,请根据以下结果为自己构建一个新文件名os.path.splitext()

base, ext = os.path.splitext(filename)
normalized_filename = base + ext.lower()

现在normalized_filename是降低了扩展名的文件名,因此您可以根据需要在集合中使用该值。

于 2013-05-21T07:22:19.727 回答