我有一个目录,其中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)
答案 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"
此代码:
glob.glob
获取所有xml文件。str.rsplit
将文件名拆分为名称和扩展名(例如"name.xml"
到("name", ".xml")
)。第二个参数会停止str.rsplit
多次拆分。.P7M
扩展名。os.path.exists
查看密钥文件是否存在。如果不是,则xmlfile是无符号的,因此将其打印出来。如果您在列表中需要它们,您可以:
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