我有一个文件列表1.dat
,...,N.dat
在我想要阅读和分析的目录中。
我做了以下
for f in os.listdir('.'): # read all the files in the directory
if f.endswith('.dat'): # use only the ones with .dat as extansion
print(f)
data1 = np.loadtxt(f)
# some operations on each file
这样,文件以随机顺序拍摄,输出为print:
6.dat
4.dat
8.dat
5.dat
13.dat
10.dat
1.dat
16.dat
20.dat
19.dat
所以我的问题是,我如何强制脚本以有序的方式读取文件?从文件1.dat
到N.dat
。
答案 0 :(得分:6)
您需要获取完整的文件列表,然后按照您想要的顺序对它们进行排序。
files = [f for f in os.listdir('.') if f.endswith('.dat')]
这会为您提供.dat
个文件的列表。你不需要一个完整的for
循环,列表理解会更快。
排序的技巧是你需要一个能给你正确顺序的钥匙。在这种情况下,转换为键的数值:
files.sort(key=lambda f: int(f[:-4]))
如果你确定所有的dat文件都有除了最后四个字符之外的数字名称,那么它只能 。
现在您可以处理您的清单:
for f in files:
data1 = np.loadtxt(f)
...
对于更复杂的排序算法,我建议使用库https://stackoverflow.com/a/39478986/1527544。然后你的排序步骤看起来像
from natsort import natsorted
files = natsorted(files)
OR
from natsort import humansorted
files = humansorted(files)
第二个版本是区域设置感知的。
答案 1 :(得分:3)
files = []
for f in os.listdir('.'): # read all the files in the directory
if f.endswith('.dat'): # use only the ones with .dat as extansion
files.append(f)
files.sort(key=lambda x:int(x.split('.')[0]))
for f in files:
data1 = np.loadtxt(f)
# some operations on each file
答案 2 :(得分:3)
你有正确的想法。您只需要以“人 - 自然”的方式对文件进行排序。有几种不同的方法;用零填充它们然后排序。我喜欢这个:
import re
def sorted_nicely(iter):
""" Sort the given iterable in the way that humans expect; i.e,
'2fast2furious' < '11fast11furious'
"""
convert = lambda text: int(text) if text.isdigit() else text
alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ]
return sorted(iter, key=alphanum_key)
EG:
>>> print(sorted_nicely('a.dat 6.dat 4.dat 8.dat 5.dat 13.dat 10.dat 16.dat 18.dat 20.dat'.split())
['4.dat', '5.dat', '6.dat', '8.dat', '10.dat', '13.dat', '16.dat', '18.dat', '20.dat', 'a.dat']
答案 3 :(得分:2)
您可以使用key
功能的.sort()
参数对文件列表进行排序。但是要根据文件的数值对文件进行排序,需要将文件名的数字部分转换为整数:
files = [file for file in os.listdir('.') if file.endswith('.dat')]
files.sort(key=lambda filename: int(filename[:-4]))
for f in files:
data1 = np.loadtxt(f)