1

我有一组存储在目录树中的数据。给定日期的数据位于包含日期名称的文件夹中(例如第一天为 01,一个月中的第十四天为 14,等等),给定月份的所有日期的文件夹都存储在每月文件夹(数字 01 到 12)和所有月份文件夹都在一个年度文件夹中(在我的例子中是 2014、2015 和 2016)。所有这些都在另一个文件夹中。

我已经定义了 3 个函数,它们都通过使用带有os.listdir()的for迭代器来遍历一个文件夹(但执行一些不同的操作):

for e in os.listdir(os.curdir):
    if e.endswith(refer[-4:]:
        #Performs operations (GDAL related)

在程序的早期,我让用户输入某些参数,包括顶层文件夹(通过os.curdir输入到函数中)和参考文件(存储在参考变量中)。这些函数返回一个存储在out_arr中的变量arr。如果用户想要浏览所有数据,我有这行代码调用正确的函数并深入到目录树:

elif param_vrsta == "dr" and param_obdobje == "v":
    for dd in os.listdir(os.curdir):
        for aa in os.listdir(dd):
            for kk in os.listdir(aa):
                out_arr = krog1()

有几个elif在前后深入一层或两层或三层,并调用三个函数之一。

但我不断收到错误消息:

FileNotFoundError:[WinError 3] 找不到路径:'01'

for kk in os.listdir(aa):

线。最终目标是能够选择是对一个文件夹(天)、一个月(最多 31 个数据文件夹)、一年(12 个文件夹,最多 31 个数据文件夹)执行操作,还是只对所有数据执行操作,让功能每次都能正常工作。我是否错过了一些语法错误(或添加了太多行),还是我从一开始就以错误的方式解决了这个问题?

4

2 回答 2

0

我不会说你做错了什么。我认为有一个更简单的方法。

考虑一下这个文件夹结构,与你所拥有的相比,它被截断了。

文件夹

每个最低级别的文件夹仅包含一个名为 data.txt 的文件。

一旦设置Path为顶级路径名,您就可以获得该路径下文件的各种子集的迭代器。

>>> from pathlib import Path

>>> path = Path('temp/')

所有文件:

>>> list(path.glob('*/*/*'))
[WindowsPath('temp/01/01/data.txt'), WindowsPath('temp/01/02/data.txt'), WindowsPath('temp/02/01/data.txt'), WindowsPath('temp/02/02/data.txt'), WindowsPath('temp/03/01/data.txt'), WindowsPath('temp/03/02/data.txt')]

所有二月文件:

>>> list(path.glob('02/*/*'))
[WindowsPath('temp/02/01/data.txt'), WindowsPath('temp/02/02/data.txt')]

该月第二天的所有文件:

>>> list(path.glob('*/02/*'))
[WindowsPath('temp/01/02/data.txt'), WindowsPath('temp/02/02/data.txt'), WindowsPath('temp/03/02/data.txt')]

二月第二天的所有文件:

>>> list(path.glob('02/02/*'))
[WindowsPath('temp/02/02/data.txt')]

编辑:补充:

from pathlib import Path

top_path = input('Please input the full name of the top path:')
path = Path(top_path)
year = input('What year do you want to consider? (Enter * for all years)')
month = input('What month do you want to consider? (Enter * for all months)')
day = input('What day do you want to consider? (Enter * for all days)')

for item in path.glob('{}/{}/{}'.format(year, month, day)):
    <do something with item here>
于 2017-09-08T21:53:18.630 回答
0

我认为你应该认真考虑比尔贝尔的回答的方法,但为了完整起见,这就是(我认为)是你得到错误的原因: os.listdir 返回不合格的文件名,所以当你深入研究你需要的目录层次结构时沿途指定每个目录。

像这样的东西:

for year_dir in os.listdir(os.curdir):
    year_dir = os.path.join(os.curdir, year_dir)
    for month_dir in os.listdir(year_dir):
        month_dir = os.path.join(os.year_dir, month_dir)
        for day_dir in os.listdir(month_dir):
            ...

备择方案:

  • 使用 glob.glob() 而不是 os.listdir():glob 确实限定了文件名
  • 使用递归全局,可能与 pathlib.Path 结合使用(如比尔贝尔的回答)
  • 使用 os.walk()
于 2017-09-08T22:09:22.627 回答