os.listdir(folder)函数打印出错误的文件顺序

时间:2020-07-13 12:51:34

标签: python

enter image description here

在我的文件夹中,我的文件具有以下正常顺序。但是,当我使用以下代码将文件打印到python中时:

for i in os.listdir(folder):
    print(i)

我得到以下输出:

spam2.txt
spam304.txt
spam33000.txt
spam34.txt
spam4.txt

显然顺序不正确,因为您会看到数值以错误的方式混合在一起。

我的问题是:

使os.listdir函数使python以这种方式打印吗,并且有办法避免这种情况吗?

我想要得到的输出是:

spam2.txt
spam4.txt
spam34.txt
spam304.txt
spam3044.txt
spam33000.txt

如果对我的问题有任何批评,请张贴在下面,如果愿意,我愿意修改我的问题!

2 个答案:

答案 0 :(得分:5)

来自documentation of os.listdir()

返回一个包含目录中条目名称的列表 由路径给出。 列表以任意顺序,并且不包括 特殊条目“。”和“ ..”,即使它们存在于 目录。

要通过数字获取订单,可以使用例如正则表达式模式:

import re 
import os 

files = os.listdir('data')
re_pattern = re.compile('.+?(\d+)\.([a-zA-Z0-9+])')
files_ordered = sorted(files, key=lambda x: int(re_pattern.match(x).groups()[0]))

输出

In [1]: files
Out[1]: ['spam2.txt', 'spam3.txt', 'spam304.txt', 'spam3300.txt', 'spam34.txt']

In [2]: files_ordered
Out[2]: ['spam2.txt', 'spam3.txt', 'spam34.txt', 'spam304.txt', 'spam3300.txt']

简短说明:

  • sorted()接受一个key参数,该参数可用于对列表进行排序。在这里,我们读取文件名中点之前的数字。 注意:您必须确保正则表达式模式与所有文件匹配。
  • .+?开头的所有内容都匹配,但不是贪心的(将尽可能少地匹配)
  • (\d+)将匹配并捕获尽可能多的数字,然后您可以从.groups()[0]中读取这些数字。
  • \.将与文件名中的点匹配
  • ([a-zA-Z0-9]+)将匹配文件扩展名(字母数字)

答案 1 :(得分:1)

尝试按长度排序:

import os
folder ="1"
for i in sorted(os.listdir(folder), key=len):
    print(i)