排序()仅在第一个呼叫上失败



我正在使用python 3.7.4。我要排序的数据是在一系列具有'1234_5678.A.CSV','1234_5678.b.csv','1234_5678.c.csv','1234_5678.c.csv','1234_5678.d.5678.d.csv','1234_5678.B.CSV','1234_5678.A.CSV','1234_5678.A.CSV'中等。

代码如下:

import sys
## GET ALL CSV Files in a folder
import os
import glob
def filter_name(filterString, fileNames):
    filtered = []
    for name in fileNames:
        if filterString in name:
            filtered.append(name)
    return filtered
def sort_key(fileName):
    """Assumes file name of 12345_9876.A.csv structure
    returns 9876 value"""
    _, backhalf = fileName.split("_")
    return backhalf.split(".")[0]
file_path=r'C:\Auto\201907 compare\AEG data\#1022206 abcdef879 S1 - doneagain\orig - Copy\'
path = file_path
extension = 'csv'
#os.chdir(path)  # TODO This might be causing more problems than just the image packing thing...
listOfFiles = [i for i in glob.glob(os.path.join(path, '*.{}').format(extension))]
listOfFiles = ['C:\Auto\201907 compare\AEG data\#1022206 abcdef879 S1 - doneagain\orig - Copy\20190531_155638064567.A.csv',
'C:\Auto\201907 compare\AEG data\#1022206 abcdef879 S1 - doneagain\orig - Copy\20170532_155646505788.B.csv',
'C:\Auto\201907 compare\AEG data\#1022206 abcdef879 S1 - doneagain\orig - Copy\20170532_155654944787.C.csv',
'C:\Auto\201907 compare\AEG data\#1022206 abcdef879 S1 - doneagain\orig - Copy\20170532_155703390027.D.csv',
'C:\Auto\201907 compare\AEG data\#1022206 abcdef879 S1 - doneagain\orig - Copy\20170532_155901884437.A.csv',
'C:\Auto\201907 compare\AEG data\#1022206 abcdef879 S1 - doneagain\orig - Copy\20170532_155910324109.B.csv',
'C:\Auto\201907 compare\AEG data\#1022206 abcdef879 S1 - doneagain\orig - Copy\20170532_155918771536.C.csv',
'C:\Auto\201907 compare\AEG data\#1022206 abcdef879 S1 - doneagain\orig - Copy\20170532_155927211990.D.csv']

###listOfFiles = ['20170532_155638064567.A.csv', '20190732_155646505788.B.csv', '20190732_155654944787.C.csv', '20190732_155703390027.D.csv', '20170532_155901884437.A.csv', '20170532_155910324109.B.csv', '20190732_155918771536.C.csv', '20190732_155927211990.D.csv']
Afilenames = sorted(filter_name("A", listOfFiles), key=sort_key)
Bfilenames = sorted(filter_name("B", listOfFiles), key=sort_key)
Cfilenames = sorted(filter_name("C", listOfFiles), key=sort_key)
Dfilenames = sorted(filter_name("D", listOfFiles), key=sort_key)


print("# Of Files: n")
print(len(listOfFiles))
print("List Of Files: n")
print(listOfFiles)
print("# Of A Files: n")
print(len(Afilenames))
print("# Of B Files: n")
print(len(Bfilenames))
print("# Of C Files: n")
print(len(Cfilenames))
print("# Of D Files: n")
print(len(Dfilenames))

打印语句的输出不正确。

Total files = 8
Total A files = 8 
Total B files = 2

这是一个奇怪的问题..任何提示?

您的问题是您的filter_name函数允许filterString名称中的任何位置,而glob返回的名称不仅单独使用文件名,而且是文件的完整路径。<<<<<<<<<<

您的路径全部包括CA(在目录中AutoAEG data中(,它们都包括C(驱动器字母(,因此它们 all 通过AC的过滤器(均不是B(否D出现在最终文件名之外的路径中,因此它们会按照您的期望进行过滤(。

如果您想仅根据名称过滤而不是完整的路径过滤,请以测试目的剥离路径:

def filter_name(filterString, fileNames):
    filtered = []
    for name in fileNames:
        if filterString in os.path.basename(name):  # basename removes the rest of the path
            filtered.append(name)
    return filtered

最新更新