文件名称排序 字符串序+数字序 python

# -*-coding:utf8-*-

"""
基于字符串数字混合排序的Python脚本
"""

def is_number(s):
    try:
        float(s)
        return True
    except ValueError:
        pass

    try:
        import unicodedata
        unicodedata.numeric(s)
        return True
    except (TypeError, ValueError):
        pass

    return False

def find_continuous_num(astr, c):
    """

    :param astr: a string
    :param c: where to start looking for
    :return: num: int
    """
    num = ‘‘
    try:
        while not is_number(astr[c]) and c < len(astr):
            c += 1
        while is_number(astr[c]) and c < len(astr):
            num += astr[c]
            c += 1
    except:
        pass
    if num != ‘‘:
        return int(num)

def comp2filename(file1, file2):
    """
    compare 2 filename:
    if the prev part of 2 strings are the same, compare the next continuous number
    file1 < file2 : return True, otherwise False
    :param file1:
    :param file2:
    :return:
    """
    smaller_length = min(len(file1), len(file2))
    continuous_num = ‘‘
    for c in range(0, smaller_length):
        if not is_number(file1[c]) and not is_number(file2[c]):
            # print(‘both not number‘)
            if file1[c] < file2[c]:
                return True
            if file1[c] > file2[c]:
                return False
            if file1[c] == file2[c]:
                if c == smaller_length - 1:
                    # print(‘the last bit‘)
                    if len(file1) < len(file2):
                        return True
                    else:
                        return False
                else:
                    continue
        if is_number(file1[c]) and not is_number(file2[c]):
            return True
        if not is_number(file1[c]) and is_number(file2[c]):
            return False
        if is_number(file1[c]) and is_number(file2[c]):
            if find_continuous_num(file1, c) < find_continuous_num(file2, c):
                return True
            else:
                return False
    # if file1 < file2:
    #     return True
    # else:
    #     return False

def sort_insert(lst):
    """
    simple insert sort
    :param lst:
    :return:
    """
    for i in range(1, len(lst)):
        x = lst[i]
        j = i
        while j > 0 and lst[j-1] > x:
        # while j > 0 and comp2filename(x, lst[j-1]):
            lst[j] = lst[j-1]
            j -= 1
        lst[j] = x
    return lst

def sort_insert_filename(lst):
    """
    simple insert sort
    :param lst:
    :return:
    """
    for i in range(1, len(lst)):
        x = lst[i]
        j = i
        # while j > 0 and lst[j-1] > x:
        while j > 0 and comp2filename(x, lst[j-1]):
            lst[j] = lst[j-1]
            j -= 1
        lst[j] = x
    return lst

def file_name_sort(all_file_list):
    """

    :param all_file_list: list
    :return: new_list:list
    """
    new_list = []
    # all_file_list.sort(key=lambda x: int(x.split(‘.‘)[0].split(‘_‘)[2]))
    # for file in all_file_list:
    #     pass

    return new_list

if __name__ == "__main__":
    print(sort_insert_filename([‘a09‘, ‘a2‘, ‘b2‘, ‘a10‘,‘a100‘, ‘a01‘, ‘a010‘, ‘_a3‘, ‘a893‘, ‘a90‘]))
时间: 2024-10-08 05:23:43

文件名称排序 字符串序+数字序 python的相关文章

C# 模拟windows文件名称排序(使用windows自带dll)

[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)] private static extern int StrCmpLogicalW(string psz1, string psz2); /// <summary> /// 根据路径查到文件,按文件名称排序,智能排序,非ASCII码排序 /// </summary> /// <param name="pathToVersions"&

文件名称排序

第一次写博客练习下 1 定义个文件比较类 public class FilesNameComparerClass :IComparer<string> { [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)] private static extern int StrCmpLogicalW(string psz1, string psz2); public int Compare(string x, string y)

java file.listFiles()按文件名称、日期、大小排序

1:按 文件名称 排序是什么规则呢? windows的命名规则是,特殊字符(标点.符号)> 数字 > 字母顺序 > 汉字拼音.首字规则,首字相同看第二个,依次类推… 例如:全是数字的情况,100<200<300 :111<121<131; 111<112<113; 2:按 文件日期 排序是什么规则呢? 按 文件日期 排序分两种: (1)按文件创建日期排序(比较特殊)(2)按文件修改日期排序文件创建日期排序:也就字面意思啦. 文件修改日期排序:按照文件修

python批量修改文件名称

参考文章:http://www.cnblogs.com/ma6174/archive/2012/05/04/2482378.html 最近遇到一个问题,在网上下载了一批视频课程,需要将每节课的名称标号,方便排序观看,正好看了两天python语法,就想着用python实现一个简单的改名字的程序,果然有人已经做了,参考一下前辈的文章代码,差了点资料,就实现了一个简单的改名字的程序. 代码是参考前辈的,如有侵权请联系. # -*- coding: utf-8 -*- 'change file name

#line 的作用是改变当前行数和文件名称

#line 的作用是改变当前行数和文件名称,它们是在编译程序中预先定义的标识符命令的基本形式如下:   #line number["filename"]其中[]内的文件名可以省略.例如:   #line 30 a.h其中,文件名a.h 可以省略不写. 这条指令可以改变当前的行号和文件名,例如上面的这条预处理指令就可以改变当前的行号为30,文件名是a.h.初看起来似乎没有什么用,不过,他还是有点用的,那就是用在编译器的编写中,我们知道编译器对C 源码编译过程中会产生一些中间文件,通过这条

利用Python从文件中读取字符串(解决乱码问题)

首先声明这篇学习记录是基于python3的. python3中,py文件中默认的文件编码就是unicode,不用像python2中那样加u,比如u'中文'. 不过在涉及路径时,比如C:\Users\Administrator\Desktop\StudyNote\Python,还是要加r. eg:r'C:\Users\Administrator\Desktop\StudyNote\Python'. 因为\是转义符,想输出'\'得写成'\\'才可以.加了r就可以让python自动处理字符串,最终的字

一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本

摘自:http://blog.csdn.net/forandever/article/details/5711319 一个获取指定目录下一定格式的文件名称和文件修改时间并保存为文件的python脚本 @for&ever 2010-07-03 功能: 获取指定目录下面符合一定规则的文件名称和文件修改时间,并保存到指定的文件中 脚本如下: #!/usr/bin/env python# -*- coding: utf-8 -*- '''Created on 2010-7-2 @author: fore

IO流的练习5 —— 读取文件中的字符串,排序后写入另一文件中

需求:已知s.txt文件中有这样的一个字符串:“hcexfgijkamdnoqrzstuvwybpl” 请编写程序读取数据内容,把数据排序后写入ss.txt中. 分析: A:读取文件中的数据 B:把数据存在一个字符串中 C:把字符串转换成字符串数组 D:对字符串数组进行排序 E:数组转换成字符串 F:把字符串写入文件中 1 public static void main(String[] args) throws IOException { 2 // 读取文件中的数据 缓冲字符输入流 3 Buf

C#文件和文件文件夹按时间、名称排序-顺序与倒序

对于文件和文件夹有多种排序方式,常用的就是按创建或修改时间.按文件名排序.在 C# 中,按时间和文件名排序都十分简单,用数组提供的排序方法 Array.Sort() 一行代码就可以搞定,当然也可以用常用的排序方法,如快速排序.冒泡排序等. 文件排序的方法也适用于文件夹,只是传递的变量不同.为了便于使用,将分别列出C#文件排序和文件夹排序四种常用方法,分别为:按名称顺序与倒序排序.按时间顺序与倒序. 一.C#文件排序 1.按名称顺序排列 /// <summary> /// C#按文件名排序(顺序