【发布时间】:2016-02-07 18:11:29
【问题描述】:
我有一本字典 output_dict,其中包含与文件签名及其相关扩展名有关的数据,即 '43 44 30 30 31': '.ISO'。我正在尝试编写一个脚本,该脚本将以字节为单位读取文件并返回字典中的任何匹配项。如果未找到匹配项,则返回最相似的值。
有没有办法让它逐个字节地读取文件,匹配直到它到达一个打破匹配的字节,返回之前匹配的键/值?
或者,我希望它能够匹配一定的数量,或者匹配非常相似的东西(2-3 字节差异)。如果没有匹配或没有类似的对象,我希望它打印一条消息。
目前,我的代码如下所示:
root_path = "testdir"
list_of_files = os.listdir(root_path)
for files in list_of_files:
full_path = os.path.join(root_path, files)
open_it = open(full_path, 'rb')
read_it = open_it.read(x)
convert_it = get_bytes_as_displayable_hex(read_it)
convert_to_ascii = convert_it.encode('utf-8')
convert_to_string = convert_to_ascii.decode(encoding='utf-8', errors="strict")
result = (output_dict.get(convert_to_string))
if result is not None:
print("Scan complete, found: {} file(s)".format(result))
else:
result = difflib.get_close_matches(convert_to_string, output_dict, 2, 0.2)
print(result)
因此,预期结果将类似于文件的前 4 个字节是 25 50 44 46。这些字节与字典交叉引用并将匹配它,结果返回“.PDF”。
如果前四个字节是 25 50 44 47,这不在字典中,但代码仍然会返回“.PDF”,因为它们非常相似。
感谢任何帮助以及任何建议,因为我对 Python 和一般编程非常陌生。
【问题讨论】:
-
“最相似的值”
-
其中“最相似的值”是仅相差 2-3 个十六进制字节的键。即如果 FF D8 EE 00 不匹配,则返回 FF D9 EE 00 作为可能的结果。
-
不太清楚要求的是什么。
-
我不确定如何让它更清晰。我将编辑帖子以添加更多信息,看看是否有帮助。
标签: string python-3.x dictionary pattern-matching match