按升序将所有文件读取到python中的数组

时间:2013-11-19 23:03:27

标签: python arrays sorting matplotlib

我试图将目录中的大约200个文件顺序读入数组: 2种方法:

results = [open(f) for f in glob.glob("*.bin")]

这里,这给了我一个错误,很多文件都被打开了。

for f in glob.glob("*.bin"):
print f

这给了我一个无序列表,我不知道如何使用sorted(f,key=itemgetter(0))

此外,一旦我将文件0读入数组,我需要进行一些数组排序,然后与文件1中的数据连接,依此类推,直到目录中的最后一个文件为止(假设文件0,文件1都在升序)。为此,我声明x0 = 0然后以这种方式连接它:

x = numpy.concatenate((x0, x), axis=1) 

提前感谢任何建议!

编辑1:

我用这种方式尝试了你的方法:

x0 = numpy.zeros(shape=(1026, 718))
f = sorted(glob.glob('*.bin'))
for f in sorted(glob.glob('*.bin')):
    print f ## prints files ordered
    x = numpy.concatenate((x0, x), axis=1) 
    x0 = x

我收到以下错误:

x = numpy.concatenate((x0, x), axis=1) 
MemoryError

2 个答案:

答案 0 :(得分:0)

可能希望一次只打开一个文件:

def my_open(path):
    with open(path, 'r') as f:
        return numpy.loadtxt(f)

如果您只需要ls之类的排序顺序,则可以通过sorted传递列表。如果您需要更高级的东西,请参阅sorting howto

如果您可以将所有记录放入可用内存的一半,这可能会更快一些:

numpy.concatenate(map(my_open, sorted(glob('*.bin'))))

否则你可以在循环中连接并节省内存:

arr = numpy.zeros()
for path in sorted(glob('*.bin')):
    arr = numpy.concatenate((arr, my_open(path))

答案 1 :(得分:0)

我不清楚你得到了什么错误。你想按文件名排序吗?然后在返回的文件名列表中更有意义:

filenames = sorted(glob.glob('*.bin'))

然后您可以浏览文件名列表并连续读取文件以提取所需的数据。

for filename in sorted(glob.glob('*.bin')):
    f = open(filename)
    # Perform your necessary array ordering
    # Concatenate the data

如果你想向后执行此操作,那就是将上一个文件中的数据读入x,然后读取并追加倒数第二个数据,然后将排序更改为

sorted(glob.glob('*.bin'), reverse = True)