簡體   English   中英

如何對包含文件名的列表進行排序?

[英]how to sort a list containing filenames?

我有一個約 1000 多個值的列表。 這些值是由os.listdir(folder_path)給出的文件夾中的文件名

代碼如下所示:

import os

folder_path = "some path here"
filelist = os.listdir(folder_path)

print(filelist)

現在,當我查看打印的列表時,我發現該列表沒有按名稱排序。 文件名類似於["text-1-1.txt","txt-1-23.txt","txt-1-32.txt","txt-1-10.txt","txt-2-1.txt","txt-2-32.txt"...]

另外,我知道有些文件名會加一,例如:text-1-1.txt、text-1-2.txt、text-1-3.txt、.... text-2-1.txt , 文本 2-2.txt,...

我嘗試了這兩種方法來嘗試對列表進行排序: new_list = sorted(filelist) & filelist.sort()

兩者都不起作用,並且列表與原始列表相同,我該如何對該列表進行排序? 我是否必須手動編寫排序算法(如 Bubble 或 Selection)?

你可以這樣運行它:

import os

folder_path = "some path here"
filelist = os.listdir(folder_path)
filelist.sort()    #Added this line

print(filelist)

您可以為此創建一個自定義 function ,它從文件名創建一個int tuple

>>> def sl_no(s):
        return tuple(map(int,s.split('.')[0].rsplit('-', 2)[-2:]))

>>> sl_no("text-1-1.txt")
(1, 1)

>>> sorted(filelist, key=sl_no)
 
['text-1-1.txt',
 'txt-1-10.txt',
 'txt-1-23.txt',
 'txt-1-32.txt',
 'txt-2-1.txt',
 'txt-2-32.txt']

或者,您可以使用re

>>> import re
>>> sorted(filelist, lambda x: tuple(re.findall(r'\d+', x)))

['text-1-1.txt',
 'txt-1-10.txt',
 'txt-1-23.txt',
 'txt-1-32.txt',
 'txt-2-1.txt',
 'txt-2-32.txt']

默認情況下,python 已經按字典順序對字符串進行排序,但大寫字母都排在小寫字母之前。 如果你想對字符串進行排序並忽略大小寫,那么你可以這樣做

new_filelist = sorted(filelist, key=str.lower)

為了支持各種包含數字的文件名,您可以定義一個 sortKey function 來隔離名稱的數字部分並右對齊它們(使用前導零)以進行排序:

import re
def sortKey(n): 
    return "".join([s,f"{s:>010}"][s.isdigit()] for s in re.split(r"(\d+)",n))

output:

names = ["text-1-1.txt","txt-1-23.txt","txt-1-32.txt","txt-1-10.txt",
         "txt-2-1.txt","txt-2-32.txt"]

print(sorted(names,key=sortKey))
# ['text-1-1.txt', 'txt-1-10.txt', 'txt-1-23.txt', 'txt-1-32.txt', 
#  'txt-2-1.txt', 'txt-2-32.txt']


names = ["log2020/12/23.txt","log2021/1/3.txt","log2021/02/1.txt",
         "log2021/1/1.txt","log2021/1/13.txt"]

print(sorted(names,key=sortKey))
# ['log2020/12/23.txt', 'log2021/1/1.txt', 'log2021/1/3.txt', 
#  'log2021/1/13.txt', 'log2021/02/1.txt']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM