以与目录中相同的顺序输出文件名 - Python

时间:2017-11-16 19:55:03

标签: python

我正在尝试创建一个.txt文件,该文件读取给定目录中的所有文件名,并将没有文件扩展名的名称输出到新的.txt文件中。例如:如果我的/ images目录有img_1.jpg, img_2.jpg, img_4.jpg, img_4.jpg,则此脚本将创建一个包含img1, img2, img3, img4的txt文件 我有一个脚本可以很好地创建txt文件,但输出名称的顺序与我目录中的图像的放置顺序不同。

import os    
files_no_ext = [".".join(f.split(".")[:-1]) for f in os.listdir() if os.path.isfile(f)]

with open('trainval.txt', 'w') as f:
    for s in files_no_ext:
        f.write("%s\n" % s)

图像目录按以下顺序包含图像:

banana-0.jpg
banana-1.jpg
banana-2.jpg
.
.
banana-1000.jpg

但.txt文件中的输出是:

banana-0
banana-1
banana-10
banana-100
banana-1000
banana-1001
banana-1002
banana-1003
banana-1004
banana-1005
banana-1006
banana-1007
banana-1008
banana-1009

如何确保输出的顺序与目录中图像的顺序相同?

1 个答案:

答案 0 :(得分:2)

listdir()会保留file system的订单。

请参阅:

Python - order of os.listdir

Nonalphanumeric list order from os.listdir() in Python

根据文件名中的数值对列表进行排序:

使用sortedregex对文件名的数值进行排序。

import re
import os  

files_no_ext = [".".join(f.split(".")[:-1]) for f in os.listdir() if os.path.isfile(f)]

files_no_ext = sorted(files_no_ext , key=lambda x: (x, int(re.sub('\D','', x)), x))

with open('trainval.txt', 'w') as f:
    for s in files_no_ext:
        f.write("%s\n" % s)
   # Could also do: f.write("\n".join(files_no_ext))

mode="a"上使用open()也可能更好(mode="a"表示追加)