Python: 根据日期将文件列表分割为子数组

我们有一个文件列表,希望将该列表分割为一个包含多个子数组的数组,每个子数组包含在同一天创建的文件。例如,如果当前数组包含 3 月 1 日至 3 月 31 日的文件,我们希望得到一个包含 31 个子数组的数组(假设每一天至少有一个文件)。
在这里插入图片描述

最终,我们想要找到每一天创建/修改时间最新的文件。如果可以在上述分割迭代中完成此操作以节省一些 CPU 周期,那将更加理想。这样,我们就得到了一个包含 31 个文件的扁平数组,每个文件对应一天,包含该天创建的最新文件。

当前的数据结构只是一个文件名的扁平列表。

2、解决方案

方案一:

我们可以使用 itertools.groupby() 函数将列表按照某个标准拆分成子列表。

import itertools
from datetime import datetime

files = ['file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', 'file5.txt']
dates = ['2023-03-01', '2023-03-02', '2023-03-03', '2023-03-04', '2023-03-05']

# 将文件和日期组合成字典
files_with_dates = dict(zip(files, dates))

# 按日期对文件进行分组
grouped_files = itertools.groupby(sorted(files_with_dates.items(), key=lambda x: x[1]), key=lambda x: x[1])

# 将分组后的文件转换为子数组
subarrays = [list(group) for group in grouped_files]

# 输出子数组
for subarray in subarrays:
    print(subarray)

方案二:

我们可以使用一个字典,其中日期作为键,元组 (文件名, 时间戳) 作为值。遍历所有文件,如果字典的时间戳小于当前文件的时间戳,或该天的值尚不存在,则更新该天的字典值。

import os
import datetime

files = ['file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', 'file5.txt']
dates = ['2023-03-01', '2023-03-02', '2023-03-03', '2023-03-04', '2023-03-05']

# 将文件和日期组合成字典
files_with_dates = dict(zip(files, dates))

# 创建一个字典来存储最新文件
latest_files = {}

# 遍历所有文件
for file, date in files_with_dates.items():
    # 获取文件的修改时间
    modification_time = os.path.getmtime(file)

    # 如果字典中没有该天的记录,或当前文件的时间戳比字典中的时间戳新,则更新字典
    if date not in latest_files or modification_time > latest_files[date][1]:
        latest_files[date] = (file, modification_time)

# 输出最新文件
for date, (file, modification_time) in latest_files.items():
    print(f'Date: {date}, File: {file}, Modification Time: {datetime.datetime.fromtimestamp(modification_time)}')

方案三:

在 Messa 答案的基础上,如果你的数据结构如下:

files = [{'date': datetime(2010, 3, 1, 0, 0, 10), 'file': 'foo'},
         {'date': datetime(2010, 3, 1, 12, 0, 10), 'file': 'bar'},
         {'date': datetime(2010, 3, 2, 3, 5, 10), 'file': 'baz'},
         {'date': datetime(2010, 3, 2, 3, 3, 10), 'file': 'foo'}]

你可以尝试以下代码:

from itertools import groupby
from datetime import datetime

# 按日期对文件进行分组
grouped_files = groupby(sorted(files, key=lambda x: x['date'], reverse=True), key=lambda x: datetime(x['date'].year, x['date'].month, x['date'].day))

# 将分组后的文件转换为子数组
subarrays = [list(group) for group in grouped_files]

# 取每个子数组的第一个元素,即最新文件
latest_files = [next(x[1]) for x in subarrays]

# 输出最新文件
for file in latest_files:
    print(file)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值