【问题标题】:Need the path for particular files using os.walk()需要使用 os.walk() 的特定文件的路径
【发布时间】:2013-05-04 03:25:43
【问题描述】:

我正在尝试执行一些地理处理。我的任务是在一个目录中找到所有 shapefile,然后在该目录中找到该 shapefile 的完整路径名。我可以获取 shapefile 的名称,但我不知道如何获取该 shapefile 的完整路径名。

shpfiles = []
for path, subdirs, files in os.walk(path):
    for x in files:
        if x.endswith(".shp") == True:
            shpfiles.append[x]

【问题讨论】:

    标签: python shapefile os.walk


    【解决方案1】:

    os.walk 为您提供目录路径作为循环中的第一个值,只需使用 os.path.join() 创建完整文件名:

    shpfiles = []
    for dirpath, subdirs, files in os.walk(path):
        for x in files:
            if x.endswith(".shp"):
                shpfiles.append(os.path.join(dirpath, x))
    

    我将循环中的path 重命名为dirpath,以免与您已经传递给os.walk()path 变量冲突。

    注意.endswith() == True的结果不需要测试; if 已经为您做到了,== True 部分完全是多余的。

    您可以使用.extend() 和生成器表达式来使上面的代码更紧凑:

    shpfiles = []
    for dirpath, subdirs, files in os.walk(path):
        shpfiles.extend(os.path.join(dirpath, x) for x in files if x.endswith(".shp"))
    

    甚至作为一个列表理解:

    shpfiles = [os.path.join(d, x)
                for d, dirs, files in os.walk(path)
                for x in files if x.endswith(".shp")]
    

    【讨论】:

    • 只是对答案的一个小补充。文件尾部可以大写,例如:test.jpgtest.JPG,这将在语句if x.endswith(".jpg"): 中返回False。我们可以使用 Python 内置函数 str.lower() 来防止可能出现的 False 。使用 if x.lower().endswith(".jpg"): 我们在比较之前降低字符串。因此,test.jpgtest.JPG 将返回 True
    【解决方案2】:

    为什么不import glob

    import glob 
    
    print(glob.glob('F:\OTHERS\PHOTOS\Panama\\mai13*\\*.jpg') )
    

    我得到了我想要的所有 jpeg,带有绝对路径

    >>> 
    ['F:\\OTHERS\\PHOTOS\\Panama\\mai13\\03052013271.jpg', 
    'F:\\OTHERS\\PHOTOS\\Panama\\mai13\\05052013272.jpg', 
    'F:\\OTHERS\\PHOTOS\\Panama\\mai13\\05052013273.jpg']
    

    【讨论】:

    • glob() 只支持固定深度的子目录,os.walk() 支持任意深度。见How can I search sub-folders using glob.glob module in Python?
    • 原始问题可以解释为单个目录。对于那些阅读此答案且不需要子目录的人(如我),glob 更 Pythonic,因为它更简洁并产生更直接有用的结果。
    • 8 年后这些回复不再有效。 Glob 现在支持递归。
    【解决方案3】:

    似乎os.path.abspath(finename) 会起作用。请尝试。

    shpfiles = []
    for path, subdirs, files in os.walk(path):
        for x in files:
            if x.endswith(".shp") == True:
                shpfiles.append(os.path.join(path, x))
    

    【讨论】:

    • 不,不会的。 abspath 将基于 当前工作目录 的文件名,它可以是完全不同的路径。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 2014-09-05
    相关资源
    最近更新 更多