Python实用工具:natsort 自然排序库从入门到实战详解

一、natsort 库基础介绍

在日常使用Python进行数据处理、文件排序、列表整理等操作时,经常会遇到非数字类型的混合字符串排序问题,例如包含数字、字母、中文的文件名、版本号、编号等内容,使用Python内置的sorted()函数排序时,会按照字符的ASCII码顺序进行排列,出现file1、file10、file2这类不符合人类阅读习惯的排序结果,而natsort就是专门解决这一问题的第三方Python库。

natsort的核心工作原理是将字符串中的数字部分提取出来转换为数值类型,再结合非数字部分进行智能拆分与排序,实现符合人类直觉的自然排序,而非机器式的字典序排序。该库采用MIT License开源许可,可免费商用、修改与分发,使用门槛极低。

natsort的优点显著:轻量无依赖、安装便捷、支持中英文、数字、版本号、文件路径等多种场景排序,API简洁易上手;缺点为仅专注于排序功能,无其他拓展能力,无法替代复杂的数据处理库,但在专属排序场景中性能与实用性拉满。

二、natsort 安装方法

natsort作为纯Python编写的第三方库,不依赖其他扩展包,通过pip工具即可快速完成安装,打开电脑的命令提示符(CMD)、PowerShell或终端,执行以下安装命令:

pip install natsort

若需要升级到最新版本,可使用升级命令:

pip install --upgrade natsort

安装完成后,在Python脚本或交互式环境中,通过import natsort导入库,无报错即代表安装成功,可正常使用所有功能。

三、natsort 基础使用方法

natsort提供了多个核心函数,最常用的为natsorted()natsort_key()index_natsorted()等,其中natsorted()用法与Python内置sorted()完全一致,可直接替换使用,无需修改原有代码逻辑,是新手入门首选函数。

3.1 基础数字字符串排序

这是natsort最基础的使用场景,解决纯数字字符串排序混乱的问题,内置排序会按字符逐个对比,natsort会识别数字整体排序。

import natsort

# 定义包含数字的字符串列表
num_str_list = ["10", "2", "1", "15", "3"]
# Python内置排序
builtin_sort = sorted(num_str_list)
# natsort自然排序
nat_sort = natsort.natsorted(num_str_list)

print("Python内置排序结果:", builtin_sort)
print("natsort自然排序结果:", nat_sort)

代码说明
列表中的元素为字符串类型数字,内置sorted()会按字符ASCII码排序,结果为['1','10','15','2','3'];natsort会识别字符串中的数字数值,排序结果为['1','2','3','10','15'],符合日常阅读习惯。

3.2 字母+数字混合字符串排序

日常工作中最常见的文件名、编号排序,均为字母与数字混合的形式,这也是natsort最核心的应用场景。

import natsort

# 定义混合字符串列表
mix_list = ["file1.txt", "file10.txt", "file2.txt", "file20.txt", "file5.txt"]
# 内置排序
builtin_res = sorted(mix_list)
# 自然排序
nat_res = natsort.natsorted(mix_list)

print("内置排序:", builtin_res)
print("自然排序:", nat_res)

代码说明
内置排序会将file10.txt排在file2.txt前面,因为字符1的ASCII码小于2;natsort会拆分字母与数字部分,按数字大小排序,结果为file1.txt、file2.txt、file5.txt、file10.txt、file20.txt,完美匹配文件管理器的排序逻辑。

3.3 忽略大小写排序

部分场景下字符串包含大小写字母,需要不区分大小写进行自然排序,natsort提供alg参数配置排序规则,natsort.IC代表忽略大小写。

import natsort

case_list = ["File1.txt", "file2.txt", "File10.txt", "file5.txt"]
# 忽略大小写自然排序
ignore_case_res = natsort.natsorted(case_list, alg=natsort.IC)

print("忽略大小写排序结果:", ignore_case_res)

代码说明
通过alg=natsort.IC参数,排序时不区分字母大小写,最终结果会按数字大小有序排列,不会因大小写差异打乱顺序。

3.4 版本号排序

软件版本号、程序版本号(如1.0.02.1.5)的排序是特殊场景,内置排序无法识别版本号的层级关系,natsort可完美处理。

import natsort

version_list = ["1.0.0", "2.1.5", "10.0.1", "2.0.10", "1.10.5"]
# 版本号自然排序
version_res = natsort.natsorted(version_list)

print("版本号排序结果:", version_res)

代码说明
版本号按主版本、次版本、修订版本层级排序,natsort会逐段识别数字,排序结果为1.0.0、1.10.5、2.0.10、2.1.5、10.0.1,符合软件版本迭代的排序规则。

3.5 中文+数字混合排序

在中文环境下,经常需要处理中文名称+数字的排序,例如商品名称、文件夹名称,natsort支持中文与数字混合的自然排序。

import natsort

chinese_list = ["测试10", "测试2", "文档1", "文档15", "报告5"]
# 中文+数字自然排序
chinese_res = natsort.natsorted(chinese_list)

print("中文混合排序结果:", chinese_res)

代码说明
natsort兼容中文字符串,能准确识别中文后的数字部分,排序结果符合中文用户的使用习惯,无乱序问题。

四、natsort 进阶使用方法

4.1 自定义排序键(natsort_key)

当需要排序的对象不是简单列表,而是字典、对象、元组等复杂数据结构时,可使用natsort_key()生成排序键,结合内置sorted()使用,灵活性更高。

import natsort

# 定义字典列表
dict_list = [
    {"name": "file1.txt", "size": 100},
    {"name": "file10.txt", "size": 200},
    {"name": "file2.txt", "size": 150}
]
# 按字典中name字段自然排序
dict_res = sorted(dict_list, key=lambda x: natsort.natsort_key(x["name"]))

print("字典列表排序结果:", [item["name"] for item in dict_res])

代码说明
通过natsort_key()将字典的name字段转换为自然排序键,再传入sorted()key参数,实现复杂数据结构的自然排序。

4.2 路径字符串排序

处理文件路径、目录路径时,路径中包含多层级数字文件夹,natsort可智能识别路径结构,避免路径排序混乱。

import natsort

path_list = [
    "data/2024/file1.csv",
    "data/2024/file10.csv",
    "data/2025/file2.csv",
    "data/2024/file5.csv"
]
# 文件路径自然排序
path_res = natsort.natsorted(path_list)

print("路径排序结果:", path_res)

代码说明
natsort会拆分路径中的文件夹名与文件名,分别进行自然排序,保证路径列表按层级与数字有序排列。

4.3 反向自然排序

natsort支持与内置排序一致的反向排序,通过reverse=True参数实现降序的自然排序。

import natsort

test_list = ["item1", "item5", "item3", "item10"]
# 反向自然排序
reverse_res = natsort.natsorted(test_list, reverse=True)

print("反向自然排序:", reverse_res)

代码说明
reverse=True会将排序结果反转,按数字从大到小排列,结果为['item10','item5','item3','item1']

4.4 多条件混合排序

当列表中同时存在字母、数字、特殊字符,需要多规则排序时,可通过alg参数组合多个排序规则,实现精细化控制。

import natsort

multi_list = ["Test_10", "test_2", "File_05", "file_1"]
# 忽略大小写+自然排序组合
multi_res = natsort.natsorted(multi_list, alg=natsort.IC | natsort.NS_LIST)

print("多条件排序结果:", multi_res)

代码说明
alg参数使用按位或|组合多个规则,IC忽略大小写,NS_LIST优化列表排序,适配复杂混合字符串。

五、实际业务场景综合案例

在实际开发中,文件批量处理、数据报表整理、日志文件排序是最常用的场景,以下以批量读取有序文件数据为完整案例,演示natsort在真实项目中的应用。

5.1 场景需求

某项目生成了大量按编号命名的日志文件,文件名格式为log_数字.log,需要按自然顺序读取所有文件内容,若使用内置排序,会导致读取顺序错乱,数据统计错误。

5.2 完整代码实现

import natsort
import os

def get_sorted_log_files(folder_path):
    """
    获取文件夹中有序的日志文件列表
    :param folder_path: 日志文件夹路径
    :return: 自然排序后的日志文件列表
    """
    # 获取文件夹中所有文件
    file_list = os.listdir(folder_path)
    # 筛选.log后缀的日志文件
    log_list = [file for file in file_list if file.endswith(".log")]
    # 自然排序日志文件
    sorted_log_list = natsort.natsorted(log_list)
    return sorted_log_list

def read_log_files(folder_path, sorted_log_list):
    """
    按顺序读取日志文件内容
    """
    for log_file in sorted_log_list:
        file_path = os.path.join(folder_path, log_file)
        with open(file_path, "r", encoding="utf-8") as f:
            content = f.read()
        print(f"===== 读取文件:{log_file} =====")
        print(content)
        print("-" * 50)

if __name__ == "__main__":
    # 日志文件夹路径(可根据实际情况修改)
    log_folder = "./logs"
    # 获取排序后的日志文件
    sorted_logs = get_sorted_log_files(log_folder)
    # 按顺序读取日志
    read_log_files(log_folder, sorted_logs)

代码说明

  1. get_sorted_log_files函数:获取文件夹内所有日志文件,通过natsort进行自然排序,保证文件顺序正确;
  2. read_log_files函数:按排序后的文件列表,依次读取每个文件的内容;
  3. 主程序:调用函数实现批量有序读取,解决内置排序导致的文件读取错乱问题。

该案例可直接应用于Python自动化脚本、数据预处理、日志分析等项目,无需复杂修改,替换文件夹路径即可使用。

5.3 数据列表清洗排序案例

在数据分析场景中,原始数据常包含杂乱的编号与名称,使用natsort可快速清洗排序,提升数据处理效率。

import natsort
import pandas as pd

# 构造杂乱的原始数据
raw_data = {
    "id": ["user10", "user2", "user1", "user15", "user5"],
    "score": [85, 90, 88, 92, 87]
}
# 转换为DataFrame
df = pd.DataFrame(raw_data)
# 按id字段自然排序
df["id_sort"] = natsort.natsort_key(df["id"])
df_sorted = df.sort_values("id_sort").drop("id_sort", axis=1).reset_index(drop=True)

print("排序后的数据:")
print(df_sorted)

代码说明
结合Pandas库使用natsort,对数据中的用户编号进行自然排序,解决数据分析中数据乱序问题,适用于Excel数据处理、CSV文件整理等场景。

相关资源

  • Pypi地址:https://pypi.org/project/natsort
  • Github地址:https://github.com/SethMMorton/natsort
  • 官方文档地址:https://natsort.readthedocs.io

关注我,每天分享一个实用的Python自动化工具。