如何将numpy文件列表转换为二进制文件列表?

时间:2017-03-21 10:34:46

标签: python numpy

我需要将一个目录中的numpy文件列表转换为另一个目录中的二进制文件列表,并保持相同的顺序和相同的名称:我唯一需要更改它的是名称中的扩展名文件;例如:

我放置numpy文件的目录:

   Tracenumber=01_Pltx1.npy
   Tracenumber=02_Pltx2.npy
   Tracenumber=03_Pltx3.npy
   Tracenumber=04_Pltx4.npy
   Tracenumber=05_Pltx5.npy
   Tracenumber=06_Pltx6.npy

我放置二进制文件的结果目录:

   Tracenumber=01_Pltx1.bin
   Tracenumber=02_Pltx2.bin
   Tracenumber=03_Pltx3.bin
   Tracenumber=04_Pltx4.bin
   Tracenumber=05_Pltx5.bin
   Tracenumber=06_Pltx6.bin

首先,我使用转换此代码将一个numpy文件转换为二进制文件:

import numpy as np
import struct

traces = np.load('C:\\Users\\user\\My_Test_Traces\\1000_Traces_npy\\Tracenumber=01_Pltx1.npy')

f = open('C:\\Users\\user\\My_Test_Traces\\1000_Traces_bin\\Tracenumber=01_Pltx1.bin', 'wb')
for t in traces.flatten():
    f.write(struct.pack('f', t))
f.close()

但是现在,我尝试了这段代码:

import os
import numpy as np
import struct
path_For_Binary_Files='C:\\Users\\user\\My_Test_Traces\\1000_Traces_bin'
os.chdir('C:\\Users\\user\\My_Test_Traces\\1000_Traces_npy')
for root, dirs, files in os.walk(r'C:\\Users\\user\\My_Test_Traces\\1000_Traces_npy'):
    for file in files:
       f=open(file,'r')
       trace= np.load(file)
       for t in trace.flatten():
         file.write(struct.pack(path_For_Binary_Files, t))
         file.close() 

但它没有给我我想要的结果。我有这个错误。

file.write(struct.pack(path_For_Binary_Files,t))

AttributeError:'str'对象没有属性'write'

1 个答案:

答案 0 :(得分:1)

如果您查看os.walk的{​​{3}},您会发现它不会只返回文件列表。

  

对于以目录top(包括top本身)为根的树中的每个目录,它会产生一个3元组(dirpath,dirnames,filenames)。

您应该将for循环更改为:

...
for root, dirs, files in os.walk(r'C:\\Users\\user\\My_Test_Traces\\1000_Traces_npy'):
    for file in files:
        ...

但是,您似乎只想解析单个目录中的文件,而os.walk用于解析整个目录树。要仅获取当前目录中的文件,您可以按照documentation

中的建议使用os.listdiros.path.isfile
files = [f for f in os.listdir('/your/path') if os.path.isfile(f)]