Python中有序的os.listdir()

8

如何按顺序将文件添加到列表中

我的目录中有以下文件:slide1.xml, slide2.xml, slide3.xml ... slide13.xml

os.listdir(path) 不会按顺序返回列表

我已经尝试了这种方式

files_list = [x for x in sorted(os.listdir(path+"/slides/")) if os.path.isfile(path+"/slides/"+x)]

输出: ['slide1.xml', 'slide10.xml', 'slide11.xml', 'slide12.xml', 'slide13.xml', 'slide2.xml', 'slide3.xml', 'slide3_COPY.xml', 'slide4.xml', 'slide5.xml', 'slide6.xml', 'slide7.xml', 'slide8.xml', 'slide9.xml']


我认为顺序没问题,'slide10.xml' 应该在 'slide2.xml' 之前。如果你想让 'slide2.xml' 在 'slide10.xml' 之前,你需要实现自定义排序。 - Andres
2个回答

10

按键排序:

import re
files = ['slide1.xml', 'slide10.xml', 'slide11.xml', 'slide12.xml', 'slide13.xml', 'slide2.xml', 'slide3.xml', 'slide3_COPY.xml', 'slide4.xml', 'slide5.xml', 'slide6.xml', 'slide7.xml', 'slide8.xml', 'slide9.xml']
ordered_files = sorted(files, key=lambda x: (int(re.sub('\D','',x)),x))

提供['slide1.xml', 'slide2.xml', 'slide3.xml', 'slide3_COPY.xml', 'slide4.xml', 'slide5.xml', 'slide6.xml', 'slide7.xml', 'slide8.xml', 'slide9.xml', 'slide10.xml', 'slide11.xml', 'slide12.xml', 'slide13.xml']


如果您的文件名包含特殊字符,例如东阿拉伯数字٠١٢٣٤٥٦٧٨٩,则\d可能会出现问题。请参见此https://dev59.com/OWw15IYBdhLWcg3wpNYB#6479605。 - Hao

1
你可能想使用自己的排序函数。
def custom_sort(x, y):
    pass
    #your custom sort

files_list = [x for x in sorted(os.listdir(path+"/slides/"), cmp=custom_sort) if os.path.isfile(path+"/slides/"+x)]

doc

还要检查natsort


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接