python - 如何按数字对 linux 中的文件进行排序?

标签 python linux

我的程序读入从文件名中解析出的数字。我希望它按原样准确排序,但在此示例中,列为 500、4000、7000。我的命名约定应如何实现这一点?也就是说,当我有递增的数字时,它会按从小到大的顺序列出。

我真正想要的是按等级排序(此处从零开始),然后按递增数字排序...500、5000、7000。

enter image description here

期望的输出

LOG-rank-0-die-10-delay-500.txt
LOG-rank-0-die-10-delay-4000.txt
LOG-rank-0-die-10-delay-7000.txt
LOG-rank-1-die-10-delay-500.txt
LOG-rank-1-die-10-delay-4000.txt
LOG-rank-1-die-10-delay-7000.txt
LOG-rank-2-die-10-delay-500.txt
LOG-rank-2-die-10-delay-4000.txt
LOG-rank-2-die-10-delay-7000.txt

相关代码

for filenamelogs in sorted(os.listdir(log_directory)):
            for each_line in filenamelogs:
                   #various file parsing activity

我正在将数据逐个文件附加到各种数组。不幸的是,如果我不能按照请求的顺序对文件读取进行排序,这对我来说很糟糕。也许我的问题转向了开发一种自定义方法以在我提供的排序约束下读取文件。

最佳答案

来自 blog 中链接的博客的评论:

>>> import re
>>> def sort_nicely(l):
...     """
...     Sort the given list in the way that humans expect. Modifies the original list.
...     """
...     convert = lambda text: int(text) if text.isdigit() else text
...     alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)]
...     l.sort(key=alphanum_key)
...
>>> mylist = ['LOG-rank-0-die-10-delay-500.txt',
... 'LOG-rank-0-die-10-delay-4000.txt',
... 'LOG-rank-0-die-10-delay-7000.txt',
... 'LOG-rank-1-die-10-delay-500.txt',
... 'LOG-rank-1-die-10-delay-4000.txt',
... 'LOG-rank-1-die-10-delay-7000.txt',
... 'LOG-rank-2-die-10-delay-500.txt',
... 'LOG-rank-2-die-10-delay-4000.txt',
... 'LOG-rank-2-die-10-delay-7000.txt']
>>> sort_nicely(mylist)
>>> print(*mylist, sep='\n')
LOG-rank-0-die-10-delay-500.txt
LOG-rank-0-die-10-delay-4000.txt
LOG-rank-0-die-10-delay-7000.txt
LOG-rank-1-die-10-delay-500.txt
LOG-rank-1-die-10-delay-4000.txt
LOG-rank-1-die-10-delay-7000.txt
LOG-rank-2-die-10-delay-500.txt
LOG-rank-2-die-10-delay-4000.txt
LOG-rank-2-die-10-delay-7000.txt

返回一个新的、排序的列表而不是修改原来的列表:

>>> def sort_nicely(l):
...     """
...     Sort the given list in the way that humans expect. Returns a new list.
...     """
...     convert = lambda text: int(text) if text.isdigit() else text
...     alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)]
...     return sorted(l, key=alphanum_key)
...
>>> newlist = sort_nicely(mylist)
>>> print(*newlist, sep='\n')

关于python - 如何按数字对 linux 中的文件进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31280210/

相关文章:

Python:将函数映射到递归迭代

python - 将 str 转换为路径类型?

python - 在用户定义的函数中访问全局框架

python - 错误 : Could not build wheels for scipy which use PEP 517 and cannot be installed directly

linux - 验证 NAT 后面的设备公共(public) IP 地址的可靠(加密)方式

linux - 节点上的多少负载太多了?

linux - 使用 mail 命令发送电子邮件时指定 from 用户

python - 使用 Psycopg2 和 unnest 时的 "Unknown"数据类型

linux - bash : Add an option to an existing command

php - 从远程系统在 apache 中安装 SOAP 扩展