根据拆分(日期时间)中的第一个元素对字符串列表进行排序

Sorting a list of strings based on the first element from split (datetime)

我有一长串字符串,用逗号分隔(基本上,csv 文件逐行读取字符串,不对分隔符执行拆分):

lines[0] = "2017-08-01 13:45:58,mytext,mytext2,mytext3,etc"
lines[1] = "2017-08-01 15:45:58,mytextx,mytext2x,mytext3x,etcx"
lines[2] = "2017-08-01 19:45:58,mytexty,mytext2y,mytext3y,etcy"
lines[3] = "..."

来自 this post 我知道如果我的行只包含日期时间,下面的代码应该可以工作:

lines_sorted = sorted(lines, key=lambda x: datetime.datetime.strptime(lines, '%Y-%m-%d %H:%M:%S'))

我想我可以使用 partition 从文件中的所有行中提取元组,其中第一个元素包含日期时间部分:

for unsortedFile in glob('*.txt'):
    with open(unsortedFile, 'r') as file:
        lines = [line.rstrip('\n').partition(',') for line in file]
        lines_sorted = sorted(lines, key=lambda x: datetime.datetime.strptime(lines[0], '%Y-%m-%d %H:%M:%S'))

..但是当然,这不起作用 "TypeError: list indices must be integers or slices, not str" 因为 lines[0] 不是引用第一个元组而是引用行列表中的第一项。我也试过使用 .strptime(lines[lambda][0], '%Y-%m-%d %H:%M:%S')) 但它都不起作用。

我知道我做错了..非常感谢任何帮助。

[编辑] 下面是来自友好评论的答案:

for unsortedFile in glob('*.txt'):
    with open(unsortedFile, 'r', encoding="utf8") as file: #read each unsorted file to lines (list)
        lines = [line.rstrip('\n') for line in file]
        lines_sorted = sorted(lines,
                    key=lambda x: x.split(',', maxsplit=1)[0]
                    )
        lines.clear()
    with open(unsortedFile,'w', encoding="utf8") as file: #overwrite file
        for line in lines_sorted:
            file.write(line + '\n')

只取split的第一个元素:

lines_sorted = sorted(
    lines, 
    key=lambda x: datetime.datetime.strptime(x.split(",")[0], 
                                            '%Y-%m-%d %H:%M:%S'
))

这样您就可以在保留原始数据的同时使用日期时间进行排序。

基本上 sorted 函数的 key 参数必须是一个接受列表项和 returns 可比较对象的函数。
sorted 将通过此功能根据列表项目的图像对列表进行排序,而不是项目本身。

这是一个示例,它混合了建议的解决方案:

lines_sorted = sorted(lines,
                      key=lambda x: x.split(',', maxsplit=1)[0]
                     )

使用此代码,具有相同日期的每个项目都将被 sorted 视为相等。