You need to enable JavaScript to run this app. Python 3.9.4 跨txt文件提取OEM密钥时行复制出现字符间多余空格求助
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.25 09:45:08