从目录中提取 "unsigned files"

Extracting "unsigned files" from a directory

我有一个目录,其中 xml 个文件与加密的 P7M 文件相关联,这意味着每个 name.xml 都有一个名称.P7M。但也有一些例外(P7M 文件不存在),我的目标是使用 python.

检测它们

我在想这个代码..你能帮忙写一个优雅的代码吗?

import glob

# functions to eleminate extension name
def is_xml(x):
  a =  re.search(r"(\s)(.xml)",x)
  if a :
    return a.group(0)
  else:
    return False


def is_P7M(x):
  a =  re.search(r"(\s)(.P7M)", x)
  if a :
    return a.group(0)
  else:
    return False

# putting xml files and P7M files in two sets
setA = set (glob.glob('directory/*.xml'))
setB = set (glob.glob('directory/*.P7M')) 


#eliminating extention names
for elt in setA:
   elt= is_xml(elt)

for elt in setB:
  elt= is_P7M(elt)


#difference between two sets. setB is always a larger set
print "unsigned files are:", setB.difference(setA)

获取字典中的所有 xml,删除扩展名并使用名称作为键并将值初始设置为 false,如果我们找到匹配的 P7M 将值设置为 True,最后打印所有键错误值。

xmls = glob.glob('directory/*.xml')
p7ms = glob.glob('directory/*.P7M')
# use xml file names as keys by removing the extension
d = {k[rsplit(k,1)[0]]:False for k in xmls}

# go over every .P7M again removing extension
# setting value to True for every match
for k in p7ms:
    k[rsplit(k,1)[0]] = True

# any values that are False means there is no .P7M match for the xml file
for k,v in d.items():
    if not v:
        print(k)

或者创建一组每个并找出不同之处:

xmls = {x.rsplit(".",1)[0] for x in  in glob.glob('directory/*.xml')}
pm7s = {x.rsplit(".",1)[0] for x  in glob.glob('directory/*.P7M')}

print(xmls - pm7s)

迭代 glob 一次并按扩展名填充文件名字典。最后,计算 'xml' 和 'P7M' 集合之间的差异。

import os, glob, collections

fnames = collections.defaultdict(set)

for fname in glob.glob('*'):
    f, e = os.path.splitext(fname)
    fnames[e].add(f)

print fnames['.xml'] - fnames['.P7M']

请注意,与其他建议不同,这会向文件系统发出一次请求,如果 FS 速度较慢(例如网络挂载),这可能很重要。

一种更简单的方法是对 .xml 文件进行 glob,然后使用 os.path.exists 检查 .P7M 文件:

import os, glob

for xmlfile in glob.glob('*.xml'):
    if not os.path.exists(xmlfile.rsplit(".", 1)[0] + ".P7M"):
        print xmlfile, "is unsigned"

此代码:

  1. 使用 glob.glob 获取所有 xml 个文件。
  2. 使用 str.rsplit 将文件名拆分为名称和扩展名(例如 "name.xml"("name", ".xml"))。第二个参数停止 str.rsplit 分裂不止一次。
  3. 采用文件名并添加 .P7M 扩展名。
  4. 使用os.path.exists查看密钥文件是否存在。如果不是,则 xml 文件未签名,因此将其打印出来。

如果您需要将它们放在列表中,您可以这样做:

unsigned = [xmlfile for xmlfile in glob.glob('*.xml') if not os.path.exists(xmlfile.rsplit(".", 1)[0] + ".P7M")]

或一组:

unsigned = {xmlfile for xmlfile in glob.glob('*.xml') if not os.path.exists(xmlfile.rsplit(".", 1)[0] + ".P7M")}

我的解决方案是:

import glob
import os

get_name = lambda fname: os.path.splitext(fname)[0]
xml_names = {get_name(fname) for fname in glob.glob('directory/*.xml')}
p7m_names = {get_name(fname) for fname in glob.glob('directory/*.p7m')}
unsigned = [xml_name + ".xml" for xml_name in \
    xml_names.difference(p7m_names)]

print unsigned