我正在尝试创建一个.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
如何确保输出的顺序与目录中图像的顺序相同?
答案 0 :(得分:2)
listdir()
会保留file system
的订单。
请参阅:
Nonalphanumeric list order from os.listdir() in Python
使用sorted
和regex
对文件名的数值进行排序。
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"
表示追加)