在Python中迭代读取已排序的文件

时间:2017-05-10 20:59:28

标签: python python-2.7 file

我有一个文件列表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.datN.dat

4 个答案:

答案 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)