如何将所有 .txt 文件加载到具有不同名称的文件夹中 - Python

How to load all .txt files in a folder with separate names - Python


我必须通过从文件夹中导入所有 .txt 文件来创建一堆 numpy 数组。这就是我现在做的方式:

wil_davide_noIA_IST_nz300           = np.genfromtxt("%s/davide/wil_davide_noIA_IST_nz300.txt" %path)
wig_davide_multiBinBias_IST_nz300   = np.genfromtxt("%s/davide/wig_davide_multiBinBias_IST_nz300.txt" %path)
wig_davide_multiBinBias_PySSC_nz300 = np.genfromtxt("%s/davide/wig_davide_multiBinBias_PySSC_nz300.txt" %path)
wig_davide_noBias_PySSC_nz300       = np.genfromtxt("%s/davide/wig_davide_noBias_PySSC_nz300.txt" %path)
wig_davide_IST_nz300                = np.genfromtxt("%s/davide/wig_davide_IST_nz300.txt" %path)
wig_davide_noBias_IST_nz300         = np.genfromtxt("%s/davide/wig_davide_noBias_IST_nz300.txt" %path)
wig_davide_PySSC_nz300              = np.genfromtxt("%s/davide/wig_davide_PySSC_nz300.txt" %path)
...

来自文件夹

我能否以某种方式使流程自动化?请注意,我希望数组与导入的文件同名(当然不包括 .txt)。
非常感谢

这是获取所有文件名的方法。

path 是您的文件路径("./" 如果在同一目录中)

import os

path = "./"

filenames = []
for filename in os.listdir(path):
  filenames.append[file]

...

此外,您还可以使用提供的 if 结构过滤某些文件。这里我只选择 txt 文件。

filter 是您可以应用的一些过滤器(使用 "." not in file 获取目录)

import os

path = "./"
filter = ".txt"

txt_filenames = []
for filename in os.listdir(path):
  if filter in file:
    txt_filenames.append[filename]

...

注意:如果文件或其名称存在任何安全问题,您不应该这样做。

否则你可以使用exec函数来获取你想要的变量。 对于列表方法,请参阅其他解决方案。

import os
path_to_folder = "."
command = ""
for f in os.listdir(path_to_folder):
    if f.endswith(".txt"):
        command += f.replace(".txt", "") + f" = np.genfromtxt('{path_to_folder}/{f}')\n"
exec(command)

根据您的 folder/file 结构,您可能需要稍微更改一下代码,但这应该会像要求的那样工作。

我还没有测试过,但我认为这个伪代码应该可以工作——唯一“伪”的是硬编码的 "dir/to/files" 字符串,您必须将其更改为路径到包含文本文件的目录。在现代 Python 中,您将使用 pathlibglob 标准库模块来遍历给定目录中的所有文本文件。创建可变数量的变量,并在运行时确定变量名从来都不是一个好主意。相反,将您的 numpy 数组保存在某种集合中。在这种情况下,我建议使用字典,这样您就可以通过键访问各个 numpy 数组,其中键是相应文件的字符串名称 - 当然没有扩展名:

def get_kv_pairs():
    from pathlib import Path
    for path in Path("dir/to/files").glob("*.txt"):
        yield path.stem, np.genfromtxt(str(path))
        

arrays = dict(get_kv_pairs())

print(arrays["wil_davide_noIA_IST_nz300"]) # Here's how you would access the individual numpy arrays.