【问题标题】:Making a Python script to load all npy/npz files in a directory制作 Python 脚本以加载目录中的所有 npy/npz 文件
【发布时间】:2014-02-16 19:11:21
【问题描述】:

我想将所有 npy/npz 文件加载到我的交互式 python shell 中,所以我不必去:

var1 = np.load('var1.npy')

每一个。我制作了这个脚本,但它不起作用,因为变量命名空间就在脚本中(假设缩进是正确的)。这样做的正确方法是什么?

def load_all():
import numpy as np
from os import listdir
from os.path import isfile, join
from os import getcwd

mypath = getcwd()
print 'loading all .npy and .npz files from ',mypath
files = [ f for f in listdir(mypath) if isfile(join(mypath,f)) ]

for f in files:  
    if f[-4:] in ('.npy','.npz'):
        name = f[:-4]+'_'+f[-3:]
        print 'loading', f, 'as', name
        var = np.load(f)
        exec(name + " = var")

【问题讨论】:

    标签: python numpy namespaces scope


    【解决方案1】:

    我会使用glob。例如,glob.glob('*.np[yz]') 将返回当前目录中所有 .npy 和 .npz 文件名的列表。然后,您可以遍历该列表,依次加载每个文件名。您是否尝试将加载它们的结果放入与文件名匹配的局部变量中?有比这更安全的设计 - 我会使用单个字典并将名称用作键,例如:

    numpy_vars = {}
    for np_name in glob.glob('*.np[yz]'):
        numpy_vars[np_name] = np.load(np_name)
    

    【讨论】:

    • "您是否尝试将加载它们的结果放入与文件名匹配的局部变量中?" - 是的!我在 SO 上看到了很多类似的问题,每个人总是说“使用字典”,即使这不是 OP 所要求的。所以... 1. 为什么? 2. 没有字典怎么办? (或者我可以使用以下方法之一从字典中取出变量:stackoverflow.com/questions/4650622/…
    • 哦,是的,等等,如果我将它包装在脚本中,这会起作用吗?我也想知道它的这方面。我的意思是,我可以把它放在一个脚本中,然后返回字典,但是如果我想从字典中提取名称并加载它们,我仍然需要手动执行,对吗?我想要一个可以运行的脚本,它只会加载所有内容并将所有变量分配给加载的数组。
    • 每个人都总是说要使用字典,因为如果你事先不知道你的变量名是什么,那是 Python 中的最佳实践。将任意名称注入本地命名空间是缓慢的、不安全的或两者兼而有之。
    • 我正在编写代码供个人用于研究项目。 AFAIK,“将任意名称注入本地命名空间”不会为我的用例带来速度或安全问题。
    【解决方案2】:

    简单和pythonic。

    import numpy as np
    from os import listdir
    
    directory_path = '.'
    file_types = ['npy', 'npz']
    
    np_vars = {dir_content: np.load(dir_content)
               for dir_content in listdir(directory_path)
               if dir_content.split('.')[-1] in file_types}
    

    【讨论】:

      猜你喜欢
      • 2021-02-19
      • 1970-01-01
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      相关资源
      最近更新 更多