提取"未签名的文件"从目录

时间:2015-02-14 14:54:40

标签: python directory python-2.x

我有一个目录,其中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)

4 个答案:

答案 0 :(得分:1)

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

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)

答案 1 :(得分:1)

迭代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速度很慢(例如网络安装),这可能很重要。

答案 2 :(得分:1)

更简单的方法是为.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查看密钥文件是否存在。如果不是,则xmlfile是无符号的,因此将其打印出来。
  5. 如果您在列表中需要它们,您可以:

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

答案 3 :(得分:1)

我的解决方案是:

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