在我的文件夹中,我的文件具有以下正常顺序。但是,当我使用以下代码将文件打印到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
如果对我的问题有任何批评,请张贴在下面,如果愿意,我愿意修改我的问题!
答案 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']
简短说明:
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)