Python 3.9.4 跨txt文件提取OEM密钥时行复制出现字符间多余空格求助
问题根因定位
- 提取出的密钥字符间出现异常空隙、常规清理手段失效的核心原因:
wmic命令通过系统重定向写输出文件时,默认采用**UTF-16 LE 编码(带BOM头)**写入内容。你用Python默认的文本读取模式(rt,匹配系统本地单字节编码)打开文件时,UTF-16编码中每个ASCII字符对应的空值高位字节(\x00)会被渲染成视觉上的空格,这类空值字节不属于常规的空白字符,因此你之前用strip、空格替换、正则匹配空白的操作都无法识别并清理它。 - 原有代码的逻辑隐患:硬编码取
lines[2]的索引方式没有兼容性兜底,遇到无内置OEM密钥的设备时,输出的结果行数不足会直接触发索引越界报错。
可直接运行的修复方案
采用Python原生子进程调用捕获命令输出的方式,跳过中间重定向写文件的不可控环节,同时用正则匹配标准格式的产品密钥,避免行数索引的兼容性问题:
import subprocess import re # 调用wmic命令,直接在Python内捕获输出,指定匹配wmic输出的编码格式 exec_result = subprocess.run( "wmic path softwarelicensingservice get OA3xOriginalProductKey", capture_output=True, encoding="utf-16", # 解决UTF-16编码解析导致的字符插空问题 text=True ) # 匹配符合Windows密钥规范的格式:4段5位字符带横杠,最后跟1段5位字符 key_pattern = re.compile(r"([A-Z0-9]{5}-){4}[A-Z0-9]{5}") matched_key = key_pattern.search(exec_result.stdout) if matched_key: clean_key = matched_key.group() # 写入最终的密钥文件 with open("prod_key_solo.txt", "w", encoding="utf-8") as f: f.write(clean_key) print(f"提取成功,OEM密钥为:{clean_key}") else: print("未在设备BIOS中检测到内置的OEM原始产品密钥")
适配原有流程的修改提示
如果你需要保留原有“先写wmic输出到prod_key_output.txt、再逐行读取提取”的流程,仅需修改两处即可解决问题:
- 如果保留原有重定向步骤,在读取
prod_key_output.txt时,必须指定文件编码为utf-16,即把原代码里的open("prod_key_output.txt", "rt")改为open("prod_key_output.txt", "rt", encoding="utf-16")。 - 提取密钥行时,先对读到的行执行
.strip()清理首尾的不可见字符,再写入目标文件,不要直接硬编码取固定行号,优先通过内容匹配判断哪一行是实际的密钥。
内容的提问来源于stack exchange,提问作者Isaac Marcus
相关产品推荐
相关产品推荐

