0

我有几个包含 a.shp 或 b.shp 的文件夹,以及一些其他杂项文件。或者,一个文件夹可以同时包含 a.shp 和 b.shp。在那种情况下,我想选择a.shp。如果一个文件夹没有这两个文件,我会从我的分析中排除该文件夹。

我必须编写一个类似于以下的python代码:

 if folder1 has a.shp only:
    myunit = r"D:\folder1\a.shp"
 elif folder2 has b.shp only:
    myunit = r"D:\folder2\b.shp"
 elif folder3 has a.shp and b.shp:
    myunit = r"D:\folder3\a.shp"
 elif folder4 doesn't have a.shp and b.shp:
    Don't assign anything into myunit.

如果有人可以提供有关如何在 Python 中执行此操作的建议,我将不胜感激。

谢谢你。

4

3 回答 3

1

听起来好像你想要os.path.exists,它将路径名作为参数并返回TrueFalse取决于它是否是存在的文件(或目录)的名称。您可能还需要os.path.join构建文件名。

于 2012-04-27T01:29:32.057 回答
1

我认为您的代码与您的问题描述不一致。我假设问题描述正确,所以我创建了一个函数来过滤您需要的目录:

import os

def filter_dirs(dirs=[]):
    result = []
    for dir in dirs:
        files = os.listdir(dir)
        file_a = 'a.shp' in files
        file_b = 'b.shp' in files
        if file_a or file_b:
            result.append({'dir':dir, 'file_a':file_a, 'file_b':file_b})
    return result

然后使用一些文件夹尝试该功能并查看结果:

filter_dirs(['D:\folder1', 'D:\folder2', 'D:\folder3'])
于 2012-04-27T01:50:15.107 回答
0

如果你想避免导入 os.path.exists 等,你可以使用 try/catch 逻辑。如果 a 在那里,你总是想要它,所以你可以试着打开它。如果这不起作用,请捕获错误并尝试打开 b。如果这不起作用,请捕获错误并忽略该文件夹。

文档中的代码片段(ctrl+f 表示“异常”)显示了推荐的方法:

def get_status(file):
    try:
        return open(file).readline()
    except EnvironmentError as err:
        print "Unable to open file: {}".format(err)
        sys.exit(1)

同样来自文档,一个片段显示了 os.path 的另一种方式,如 Gareth 所述:

def get_status(file):
    if not os.path.exists(file):
        print "file not found"
        sys.exit(1)
    return open(file).readline()

但是文档引用了这一点,以风格为由建议反对它。Python 特意有优雅的异常处理;利用这一点被认为比在你做之前担心 C 风格的偏执检查一切更惯用。但是,如果您想以 os.path 的方式执行此操作,请执行任何操作。无论哪种方式都有效。

于 2012-04-27T01:32:55.783 回答