迭代Python

时间:2017-09-08 20:47:36

标签: python-3.x python-os

我有一组存储在目录树中的数据。给定日期的数据位于一个文件夹中,该文件夹显示当天的名称(例如第一天的01,一个月的第十四天的14等),给定月份的所有文件夹都按月存储文件夹(编号01到12)和所有月份文件夹都在年度文件夹中(在我的情况下为2014,2015和2016)。所有的theese都在另一个文件夹中。

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

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

在程序的早期,我让用户输入某些参数,包括顶层文件夹(通过 os.curdir 输入到函数中)和参考文件(存储在中指定< / em>变量)。函数返回存储在 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()

有几个 elifs 在前后深入一个或两个或三个级别,并调用三个函数中的一个。

但我一直收到错误:

  

FileNotFoundError:[WinError 3]无法找到路径:&#39; 01&#39;

上的

for kk in os.listdir(aa):

线。 最终目的是能够选择一个文件夹(白天),一个月(最多31个数据文件夹),一年(12个文件夹,最多31个数据文件夹)或只是所有数据和每次都有功能。 我是否错过了一些语法错误(或添加了太多行),或者我是否从getgo中采用了错误的方法?

2 个答案:

答案 0 :(得分:0)

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

考虑与您拥有的文件夹结构相比,此文件夹结构被截断。

folders

每个最低级别的文件夹只包含一个名为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>

答案 1 :(得分: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确实限定文件名
  • 使用递归glob,可能与pathlib.Path结合使用(如Bill Bell的回答)
  • 使用os.walk()