我们有一个文件列表,希望将该列表分割为一个包含多个子数组的数组,每个子数组包含在同一天创建的文件。例如,如果当前数组包含 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)