从目录中提取 "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"
此代码:
- 使用
glob.glob
获取所有 xml 个文件。
- 使用
str.rsplit
将文件名拆分为名称和扩展名(例如 "name.xml"
到 ("name", ".xml")
)。第二个参数停止 str.rsplit
分裂不止一次。
- 采用文件名并添加
.P7M
扩展名。
- 使用
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
我有一个目录,其中 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"
此代码:
- 使用
glob.glob
获取所有 xml 个文件。 - 使用
str.rsplit
将文件名拆分为名称和扩展名(例如"name.xml"
到("name", ".xml")
)。第二个参数停止str.rsplit
分裂不止一次。 - 采用文件名并添加
.P7M
扩展名。 - 使用
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