将每个文件与它们在Python另一个文件夹中的对应文件进行比较?

时间:2018-06-27 07:57:28

标签: python

此代码获取一个shapefile,查看其架构,并将其与另一个位置的另一个shapefile(与之对应)进行比较,并打印出它们在架构中的差异。

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

这是在此处手动完成的。我希望通过在一个主目录中搜索文件的旧版本,然后将另一个主目录的每个子文件夹中的每个子文件夹与相应的新版本进行比较,来完成此操作。

想要的结果是什么

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

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

A 中的子文件夹与 K 中的子文件夹具有相同的名称,尽管 K 可能还有更多我们不需要的子文件夹。 / p>

我希望用户插入主A文件夹的目录,并从第一个子文件夹中读取第一个shp(如果该文件夹中存在一个shp),然后转到另一个old主文件夹,然后检查相应的子文件夹,从那里获取shp,并在它们之间进行一些比较并打印结果(我已经解决过的斜体部分),然后继续其余的{ {1}}文件夹的子文件夹。如果在一个子文件夹中没有shp,则应打印:'folder name'没有shp。并继续其余的操作。

初始集合有以下代码:

new

这里有两个要比较的主要目录:

import fiona
from pprint import pprint
import os
import fnmatch

def new_file_paths(rootdir):
    for dirpath, dirnames, filenames in os.walk(rootdir):
        if dirpath == rootdir: continue. # ignore files in the root
        yield dirpath, [os.path.join(dirpath, fname) for fname in fnmatch.filter(filenames, '*.shp')]

问题是如何对这两个主目录中具有相同名称的每对进行实际比较,并为每一个打印结果?就像刚开始但没有手动打开shapefile的循环一样,只需检查一下它们并打印差异结果即可。该代码是否按照文本中的想法执行?我一直计划使其作为文本起作用,但是我不能。

文件在这里进行测试:http://www.mediafire.com/file/644y8e12pj9jrei/main_folders.zip

1 个答案:

答案 0 :(得分:1)

您只需要结合两个部分:

rootdir_new = r'C:\Users\user\Desktop\a'
rootdir_old = r'C:\Users\user\Desktop\k'

for directory, paths in new_file_paths(rootdir_new)):
    if not paths:
        print('{} is empty, no new files found'.format(directory))
        continue

    for path in paths:
        relative_path = os.path.relpath(path, rootdir_new)
        old_path = os.path.join(rootdir_old, relative_path)
        if not os.path.exists(old_path):
            # no corresponding old file
            print('No matching previous version of {}' 
                  'found, skipping'.format(relative_path))
            continue

        # compare `path` with `old_path`

        pst_n=fiona.open(path) #new pst
        pst_o=fiona.open(old_path) #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, path, v) for k, v in d1_items if (k, v) not in d2_items] +
                        [(k, old_path, v) for k, v in d2_items if (k, v) not ind1_items])

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