Введите каждую подпапку главной папки и прочитайте определенный тип файла из каждого? - PullRequest
0 голосов
/ 26 июня 2018

Папка A имеет подпапки B,C,D, которые содержат новые «рассматриваемые» файлы. Есть также другая подобная папка с похожими подпапками, в которой есть действительные соответствующие файлы.

Все эти подпапки содержат одинаковые типы файлов. Мне нужно создать программу, которая открывает эти папки и сначала читает определенный файл .shp (в каждой подпапке существует только один .shp, B,C,D) и делает некоторые процедуры, которые я уже решил. Проблема только в том, как сделать начальную вещь, которую я описал.

я попробовал библиотеку glob:

from glob import glob
glob("directory/*/")

, которая теперь предоставляет подкаталоги главной папки. Но я не знаю, полезно ли это для процесса.

Чтобы прочитать эти shp файлы, которые я использую

import fiona
d1 = fiona.open('hxc.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 и назначить ее новой переменной.

Рабочий код для передачи в список каждой shp из каждого каталога:

UPDATE $$$$$$$$$$$$$$$$$$$$$$$$$$

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))

Основная задача следующая:

Одна основная папка A с подпапками B, C, D .... В этой основной папке находятся новые рассматриваемых файлов. Большинство подпапок имеют shps.

Хотя есть еще одна основная папка. Давайте назовем его K с подпапками L, M, N .. Эти подпапки являются соответствующими из других подпапок другой папки с новыми файлами.

Я хочу, чтобы пользователь вставил каталог главной папки A и прочитал первую shp из первой подпапки (если она там есть), затем перейдите в другую основную папку old и проверьте соответствующую подпапку получите shp оттуда и сделайте несколько сравнений между ними и напечатайте результаты (выделенные курсивом части, которые я уже решил), а затем продолжите работу с остальными подпапками папки new соответственно. в одной подпапке нет shp, он должен напечатать: у 'имя папки' нет shp. и продолжить с остальными.

Как мне это сделать?


Когда мне добавить эту комбинацию между каждой частью shapefiles.schema? если бы шейп-файлы были вставлены вручную, я бы сделал это так:

pst_n=fiona.open(r'C:\Users\user\Desktop\new\PST')#new pst
pst_o=fiona.open(r'C:\Users\user\Desktop\old\PST')#old_pst
pst_n.schema
d1 = pst_n.schema['properties']
d2 = pst_o.schema['properties']

d1_items = set(d1.items())
d2_items = set(d2.items())
result = sorted([(k, 'd1', v) for k, v in d1_items if (k, v) not in d2_items] +
                [(k, 'd2', v) for k, v in d2_items if (k, v) not in d1_items])

result = [(k, v, d) for k, d, v in result]


pprint(result)

и показывает такие различия:

[('ADDRESS', 'int:4', 'd1'),
 ('ADDRESS', 'str:254', 'd2'),
 ('AREA', 'float:19.11', 'd2'),
 ('DEC_ID', 'int:4', 'd1'),
 ('DEC_ID', 'str:254', 'd2'),
 ('DESC_', 'str:254', 'd1'),
 ('FID_PERIVL', 'int:9', 'd1'),
 ('KAEK', 'str:50', 'd1'),
 ('KAEK', 'str:12', 'd2'),
 ('LEN', 'float:19.11', 'd2'),

Теперь, как я должен показать различия каждой комбинации, когда она зацикливается?

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Я бы посоветовал вам перейти с 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] из нового главного каталога,Вы можете вносить необходимые изменения, чтобы ваш код работал, это всего лишь руководство.Примечание: папка input должна быть абсолютной (например, / 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 всегда будут соответствовать, так как они имеют одинаковые имена, только разные корневые пути.

0 голосов
/ 26 июня 2018

Вместо того, чтобы назначать потоки файлов фиксированной переменной d1, вы должны назначить их для dict, проиндексированного путевыми именами.

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)
...