【问题标题】:Iterate over files over several directories to extract data遍历多个目录的文件以提取数据
【发布时间】:2019-04-08 11:28:20
【问题描述】:

我有一系列嵌套的文件,如附图所示。对于每个“内部”文件夹(例如 001717528 文件夹),我想从每个 FITS 文件中提取一行数据并创建一个包含所有行的 CSV 文件,并以“内部”的名称命名该 CSV 文件" 文件夹(例如 001717528.csv 包含来自 18 个拟合文件的数据)。数据提取部分很简单,但我在编写迭代代码时遇到了麻烦。

我真的不知道如何遍历外部文件夹(例如 0017)和内部文件夹,并根据需要命名 csv 文件。

我的代码如下所示:

for subdir, dirs, files in os.walk('../kepler'):
    for file in files:
        filepath = subdir + os.sep + file
        if filepath.endswith(".fits"):
            extract data
        write to csv file

显然这将遍历开普勒文件夹中的所有文件,因此它不起作用。

【问题讨论】:

    标签: python loops


    【解决方案1】:

    如果您需要跟踪您进入目录结构的程度,您可以计算文件路径分隔符 (os.sep)。在您的情况下,它是 /,因为您使用的是 Mac。

    for path, dirs, _ in os.walk("../kepler"):      
      if path.count(os.sep) == 2:
        # path should be ../kepler/0017  
        for dir in dirs:  
          filename = dir + ".csv"
          data_files = os.listdir(path + os.sep + dir)
          for file in data_files:
            if file.endswith(".fits"):
              # Extract data
              # Write to CSV file
    

    据我所知,这符合您的要求,但如果我遗漏了什么,请告诉我。

    【讨论】:

    • 非常感谢!我想我掌握了窍门。会检查并告诉您是否有任何问题。
    【解决方案2】:

    试试这个代码,它应该打印所有“.fits”文件的文件路径:

    # !/usr/bin/python
    
    import os
    base_dir = './test'
    
    for root, dirs, files in os.walk(base_dir, topdown=False):
      for name in files:
        if name.endswith(".fits"):
          file_path = os.path.join(root, name) #path of files
          print(file_path)
        # do your treatment on file_path
    

    您所要做的就是添加您的具体治疗方法。

    【讨论】:

    • 您好托马斯,感谢您的帮助。这样做的问题是它不区分来自不同子文件夹的文件,而是将它们完全分组。我需要的是分别处理来自不同子文件夹的文件,并为每个子文件夹创建一个 csv 文件。你能告诉我怎么做吗?或者也许我误解了你的答案。如果是这样,如果您能指定如何实现这一点,我将不胜感激。非常感谢!
    • 对不起,我没有理解你的问题,我会尽快更新我的答案。 @staples 的回答能解决你的问题吗?
    • 您好 Thomas,@staples 回答了我的问题。非常感谢!
    猜你喜欢
    • 2023-01-27
    • 2023-04-06
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 2022-10-04
    • 1970-01-01
    相关资源
    最近更新 更多