在目录列表中获取每个唯一文件名的最新带日期文件名的逻辑

-1 投票
3 回答
37 浏览
提问于 2025-04-13 00:06

我对Python还比较陌生,现在在弄清楚如何从文件夹里的文件名中,找出每个唯一文件名前8个字符对应的最新日期的文件名。这听起来可能有点复杂,但我会通过一个文件列表和预期的输出结果来解释。

下面是一个文件夹里的文件示例:

enter image description here

从上面的文件列表可以看到,有多个文件的前8个字符是相同的,后面跟着的是日期,格式是yyyymmdd。我想要做的就是输出每个前8个字符对应的唯一文件名,但要是最新的日期。

预期的输出结果如下:

enter image description here

我自己的逻辑有点混乱,所以想请教一下,应该采取哪些逻辑步骤来实现这个目标。谢谢!

3 个回答

-2

假设你的文件格式总是和下面展示的一样:

files = [
    "AE_DIFX_20240320.zip",
    "AE_DIFX_20240321.zip",
    "AE_DIFX_20240322.zip"
    "AE_BATY_20240314.zip",
    "AE_BATY_20240315.zip",
    "AE_BATY_20240316.zip"
]

results = {}
for file in files:
    key, date  = file[0:7], int(file[8:16])
    if key not in results: results[key] = [date]
    else: results[key].append(date)

for key in results:
    print(key + '_' + str(max(results[key])) + '.zip')

那么输出结果会像下面这样:

AE_DIFX_20240322.zip
AE_BATY_20240316.zip

我假设你知道怎么获取文件列表(os.listdir)

0

编辑: 我之前的代码逻辑可能会让人感到困惑,所以我简化了代码。现在只要看看我代码里的注释,就能很容易理解逻辑。

files = [
    'AE_DIFX_20240320.zip',
    'AE_DIFX_20240321.zip',
    'AE_DIFX_20240322.zip',
    'US_BATY_20240314.zip',
    'US_BATY_20240315.zip',
    'US_BATY_20240316.zip',
    'ZW_XZIM_20240320.zip',
    'ZW_XZIM_20240321.zip',
    'ZW_XZIM_20240322.zip']

# create a list containing first 8 characters of each file 
l = [x[:8] for x in files]

# Remove duplicates by converting into  set
l = set(l)

dct = {}

# Iterate thru list l
for x in l:

    # create an empty sub list
    sub = []
    
    # iterate over files
    for y in files:

        # to make lists of files containing same prefixes
        if x in y:
            
            sub.append(y[8:16])
            dct[x] = sub

# now the dct's keys are unique prefixes. values are lists of numbers with specific prefix
# But we want only the largest of numbers for each prefix(latest date)

#concatenate key, max(value) and .zip

ls = [f'{k}{max(v)}.zip' for k, v in dct.items()]

# Sort
ls = sorted(ls)
print(ls)

# Output: ['AE_DIFX_20240322.zip', 'US_BATY_20240316.zip', 'ZW_XZIM_20240322.zip']
0

创建一个字典。字典的键是每个文件名的前8个字符。与这些键相关联的值是一个列表,列表中的内容是每个文件名剩下的字符,也就是从第9个字符开始的部分。接下来,你可以遍历这个字典中的每一项,并对每个值(列表)进行排序,这样就能找出你感兴趣的内容。

from collections import defaultdict

files = [
    "AE_DIFX_20240320.zip",
    "AE_DIFX_20240321.zip",
    "AE_DIFX_20240322.zip",
    "AE_BATY_20240314.zip",
    "AE_BATY_20240315.zip",
    "AE_BATY_20240316.zip",
    "ZW_XZIM_20240320.zip",
    "ZW_XZIM_20240321.zip",
    "ZW_XZIM_20240322.zip"
]

d = defaultdict(list)

for file in files:
    d[file[:8]].append(file[8:])

print(*[k + sorted(v)[-1] for k, v in d.items()], sep="\n")

输出:

AE_DIFX_20240322.zip
AE_BATY_20240316.zip
ZW_XZIM_20240322.zip

撰写回答