文件夹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
现在我应该如何显示每个组合在循环时的差异?
答案 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 始终对应,因为它们具有相同的名称,只是根路径不同。