【问题标题】:How to load all .txt files in a folder with separate names - Python如何将所有 .txt 文件加载到具有不同名称的文件夹中 - Python
【发布时间】:2021-06-09 12:50:27
【问题描述】:


我必须通过从文件夹中导入所有 .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)。
非常感谢

【问题讨论】:

  • 虽然我不会推荐它,如果您可以使用exec 的文件或文件名存在任何安全问题,它会将字符串作为 python 代码执行。结合os.listdir 函数,您可以将您的python 代码写在一个字符串中,然后执行它。之后变量可用。
  • 为什么要自动化呢?一旦你开始使用许多类似的变量和名称,你就会被困在整个代码中使用它们。在 Python 中,您可以将类似的数组存储在列表或字典中。您不需要将每个分配给单独的变量。
  • @hpaulj 谢谢,你能解释一下吗?我知道字典的基本工作原理,但是在这种情况下你会如何使用字典呢?

标签: python arrays numpy import txt


【解决方案1】:

我还没有对此进行测试,但我认为这个伪代码应该可以工作 - 关于它的唯一“伪”是硬编码的 "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.

【讨论】:

    【解决方案2】:

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

    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]
    
    ...
    

    【讨论】:

      【解决方案3】:

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

      否则你可以使用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)
      

      根据您的文件夹/文件结构,您需要稍微更改代码,但这应该可以正常工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-16
        • 1970-01-01
        • 2019-05-29
        • 1970-01-01
        • 2013-04-12
        相关资源
        最近更新 更多