根据拆分(日期时间)中的第一个元素对字符串列表进行排序
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
视为相等。
我有一长串字符串,用逗号分隔(基本上,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
视为相等。