输入主文件夹的每个子文件夹并从每个文件夹中读取特定文件类型?

时间:2018-06-26 07:32:21

标签: python loops operating-system

文件夹A的子文件夹B,C,D包含新的“正在考虑中”的文件。还有另一个具有相似子文件夹的相似文件夹,具有有效的对应文件。

所有这些子文件夹都包含相同的文件类型。我必须创建一个程序来打开这些文件夹,并首先读取其中的某个.shp文件(每个子文件夹中只有一个.shp,{ {1}},并执行一些我已经解决的程序。问题只是如何做我描述的最初的事情。

我尝试了glob库:

B,C,D

现在提供主文件夹的子目录。但是我不知道这对这个过程是否有帮助。

要读取我使用的这些from glob import glob glob("directory/*/") 文件

shp

所以代码是:

import fiona
d1 = fiona.open('hxc.shp)

最后一部分不会读取每个包含shp的主文件夹中的所有子文件夹。它仅分配一个import os import fiona new=input('Select directory of new folder: ') old=input('Select directory of old folder: ') for root, dirs, files in os.walk(DIRECTORY\Desktop\a'): for name in files: if name.endswith((".shp")): d1= fiona.open(os.path.join(root, name)) 文件。我想阅读每个扩展名为.shp的子文件夹,并将其分配给新变量。

每个目录中每个shp传递给列表的工作代码是这样的:

更新 $$$$$$$$$$$$$$$$$$$$$$$$$

shp

主要任务如下:

一个主文件夹A,带有B,C,D ...子文件夹。这个主文件夹在考虑文件下有新建大多数子文件夹中有shp。

虽然还有另一个主文件夹。我们将其命名为带有L,M,N ..子文件夹的K。这些子文件夹与具有 new 文件的另一个文件夹的其他子文件夹相对应。

我希望用户插入主rootdir = r'C:\Users\user\Desktop\a' # path to your root directory you walk sfiles = [] # a list with all the .shp files for entry in os.listdir(rootdir): dirpath = os.path.join(rootdir, entry) if os.path.isdir(dirpath): for file in os.listdir(dirpath): # Get all files in the subdirectories if file.endswith('.shp'): # If it's an .shp. filepath = os.path.join(dirpath, file) sfiles.append(fiona.open(filepath)) 文件夹的目录,并从第一个子文件夹中读取第一个shp(如果该文件夹中存在一个shp),然后转到另一个A主文件夹,然后检查相应的子文件夹,从那里获取old,并在它们之间进行一些比较并打印结果(我已经解决过的斜体部分),然后继续其余的{ {1}}文件夹的子文件夹。如果在一个子文件夹中没有shp,则应打印:'folder name'没有shp。并继续其余的操作。

我应该怎么做?


何时应在每个shapefiles.schema部分之间添加此组合? 如果shapefile是手动插入的,我会这样做:

shp

并显示出这样的差异:

new

现在我应该如何显示每个组合在循环时的差异?

2 个答案:

答案 0 :(得分:1)

应该将文件流分配给由路径名索引的字典,而不是将文件流分配给固定变量d1

file = {}
for root, dirs, files in os.walk('DIRECTORY\Desktop\a'):
    for name in files:
        if name.endswith(".shp"):
            path = os.path.join(root, name)
            file[path] = fiona.open(path)

答案 1 :(得分:0)

我建议您宁可使用os.listdir()而不是os.walk()

rootdir1 = '/path/to/dir' # path to your root directory you walk
rootdir2 = '/path/to/other/dir' # path to your 2nd main directory
sfiles1 = [] # a list with all the .shp files in the old subdirectories
sfiles2 = [] # a list with the .shp files in the new subdirectories
fpaths = [] # a list to check all gathered file paths not to duplicate
sdirs1 = [] # a list with all old subdirectories that contain an '.shp' 
sdirs2 = [] # a list with all new subdirectories with that .shp file
for entry in os.listdir(rootdir1):
    dirpath = os.path.join(rootdir1, entry)
    if os.path.isdir(dirpath): 
        for file in os.listdir(dirpath):
            if file.endswith('.shp'):
                if dirpath not in sdirs1:
                    sdirs1.append(dirpath) # add old subdirectories to list
for entry in os.listdir(rootdir2):
    dirpath = os.path.join(rootdir2, entry)
    if os.path.isdir(dirpath):
        for file in os.listdir(dirpath):
            if file.endswith('.shp'):
                if dirpath not in sdirs2:
                    sdirs2.append(dirpath) # add new subdirectories to list
# Then open files from old and new dir
for d in sdirs1:
    for f in os.listdir(d):
        if f.endswith('.shp') and f not in fpaths: # check not to duplicate
            fp = os.path.join(d, f)
            fpaths.append(fp)
            sfiles1.append(fiona.open(fp))
for d in sdirs2:
    for f in os.listdir(d):
        if f.endswith('.shp') and f not in fpaths:
            fp = os.path.join(d, f)
            fpaths.append(fp)
            sfiles2.append(fiona.open(fp))

然后,我认为旧主目录中的sfiles1[0]应该与新主目录中的sfiles2[0]相对应。您可以随意进行必要的更改以使代码正常工作,这只是一个指导原则。 注意:文件夹输入必须是绝对的(例如/ home / asd / dir,而不仅仅是dir)

如果子目录(旧目录和新目录)将具有相同的名称:

rootdir1 = '/path/to/dir' # path to your root directory you walk
rootdir2 = '/path/to/other/dir' # path to your 2nd main directory
sfiles1 = [] # a list with all the .shp files in the old subdirectories
sfiles2 = [] # a list with the .shp files in the new subdirectories
fpaths = [] # a list to check all gathered file paths not to duplicate
sdirs1 = [] # a list with all old subdirectories that contain an '.shp' 
sdirs2 = [] # a list with all new subdirectories with that .shp file
for entry in os.listdir(rootdir1):
    dirpath = os.path.join(rootdir1, entry)
    if os.path.isdir(dirpath): 
        for file in os.listdir(dirpath):
            if file.endswith('.shp'):
                if dirpath not in sdirs1:
                    sdirs1.append(dirpath) # add old subdirectories
                    sdirs2.append(os.path.join(rootdir2, entry)) # add new subdirectories to list (since the names are the same

# Then open files from old and new dir
for d in sdirs1:
    for f in os.listdir(d):
        if f.endswith('.shp') and f not in fpaths: # check not to duplicate
            fp = os.path.join(d, f)
            fpaths.append(fp)
            sfiles1.append(fiona.open(fp))
for d in sdirs2:
    for f in os.listdir(d):
        if f.endswith('.shp') and f not in fpaths:
            fp = os.path.join(d, f)
            fpaths.append(fp)
            sfiles2.append(fiona.open(fp))

这样, sdirs1 sdirs2 始终对应,因为它们具有相同的名称,只是根路径不同。