[Python进阶] 操作注册表:winreg

5.22 操作注册表:winreg

5.22.1 注册表概念

在Windows系统中,注册表本质上就是一个数据库,其中存放着硬件、软件、用户、操作系统以及程序相关设置信息。我们除了使用Windows系统自带的regedit程序,也可以通过Python编程读取并操作系统注册表。

5.22.2 注册表的组成部分

键(主键、项)key:相当于文件夹
子键(子项)sub_key:相当于子文件夹
值value:相当于文件,包括类型(相当于文件类型:type)、数据(相当于文件内容data)
如下图:
[Python进阶] 操作注册表:winreg_第1张图片

5.22.3 注册表的数据类型

常见的注册表值的数据类型一共有4种:

  • REG_SZ:字符串,文本字符串
  • REG_MULTI_SZ:多字符串值,含有多个文本值的字符串
  • REG_BINARY:二进制数,以十六进制显示,
  • REG_DWORD:双字值,一个32位的二进制值,显示为8位的十六进制值。

5.22.4 winreg:键的操作

5.22.4.1 打开、关闭键:OpenKey()、CloseKey()

语法:
key = winreg.OpenKey(key, sub_key[, res[, sam]])
winreg.CloseKey(key)

import winreg
from icecream import ic

HKCU = winreg.HKEY_CURRENT_USER
for subkey in ['test', 'test2', 'test3']:
    try:
        key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, subkey)  # 只读
        if key:
            winreg.CloseKey(key)
        else:
            ic(key)
    except FileNotFoundError:
        ic(f'找不到键:{subkey}')

写入打开

import winreg

mainkey = winreg.HKEY_CURRENT_USER
sub_key = r'Software\Microsoft\Internet Explorer\Main'
key = winreg.OpenKey(mainkey, subkey, 0, winreg.KEY_WRITE)
5.22.4.2 创建、删除键:CreateKey()、DeleteKey()

创建键就是在key下创建一个subkey,返回值指向subkey
语法:subkey = winreg.CreateKey(key,sub_key)
删除键就是删除指定的键的子健
语法:winreg.DeleteKey(key,sub_key)

import winreg
from icecream import ic

HKCU = winreg.HKEY_CURRENT_USER
sub_key1 = winreg.CreateKey(HKCU, 'test')
sub_key2 = winreg.CreateKey(HKCU, r'test2\t2')  # 连续创建键
ic(sub_key2)
sub_key3 = winreg.CreateKey(HKCU, 'test2')
winreg.DeleteKey(sub_key3, 't2')

说明:
1、已存在键后,再创建键不会报错。
2、若要删除的键存在子健,则无法删除。

5.22.4.3 获取某个键的所有子健
import winreg
from icecream import ic

HKCU = winreg.HKEY_CURRENT_USER
all_subkey = []
key = winreg.OpenKey(HKCU, 'System')  # 只能以只读形式打开,否则会报错
try:
    step = 0
    while True:
        all_subkey.append(winreg.EnumKey(key, step))
        step += 1
except WindowsError:
    ic('已获取全部子健!')
except Exception as err:
    ic('发生错误,错误原因:{}'.format(err))
finally:
    if key:
        winreg.CloseKey(key)

ic(all_subkey)

15:12:08|> ‘已获取全部子健!’
15:12:08|> all_subkey: [‘CurrentControlSet’, ‘GameConfigStore’]

注意:
1、只能获取到目标键的子健,无法获取更下一层的键。

5.22.4.4 查询键相关信息
from icecream import ic
import winreg

HKCU = winreg.HKEY_CURRENT_USER
subkey = r'SOFTWARE\360FileBrowser'
key = winreg.OpenKey(HKCU, subkey)
ic(winreg.QueryInfoKey(key)) # 第一个为键的子健数,第二个为键的值数

16:20:28|> winreg.QueryInfoKey(key): (3, 7, 133383550399900567)

5.22.5 winreg:值的操作

5.22.5.1 枚举键下面所有值的信息
from icecream import ic
import winreg
HKCU = winreg.HKEY_CURRENT_USER
subkey = r'SOFTWARE\360FileBrowser'
key = winreg.OpenKey(HKCU, subkey)
try:
    j = 0
    while True:
        # EnumValue方法用来枚举子健下面的值项,EnumKey用来枚举子键
        value, data, typeNo = winreg.EnumValue(key, j)
        ic(value, data, typeNo)
        j += 1
except WindowsError as e:
    ic(e)
    # 记得关闭key
    if key:
        winreg.CloseKey(key)
        ic('关闭键成功')

16:15:15|> value: ‘guide’, data: 1, typeNo: 4
16:15:16|> value: ‘dot’, data: 0, typeNo: 4
16:15:16|> value: ‘maximize’, data: 1, typeNo: 4
16:15:16|> value: ‘wnd_left’, data: 4294965696, typeNo: 4
16:15:16|> value: ‘wnd_top’, data: 0, typeNo: 4
16:15:16|> value: ‘wnd_right’, data: 0, typeNo: 4
16:15:16|> value: ‘wnd_bottom’, data: 860, typeNo: 4
16:15:16|> e: OSError(22, ‘没有可用的数据了。’, None, 259, None)
16:15:16|> ‘关闭键成功’

5.22.5.2 读取值的信息
from icecream import ic
import winreg

HKCU = winreg.HKEY_CURRENT_USER
subkey = r'Software\Microsoft\Internet Explorer\Main'
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, subkey)
value = "UseClearType"
data, type_no = winreg.QueryValueEx(key, value)
ic(data, type_no)

16:29:24|> data: ‘no’, type_no: 1

5.22.5.3 修改值的数据
import winreg

HKCU = winreg.HKEY_CURRENT_USER
subkey = r'test'
Key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, subkey, 0, winreg.KEY_WRITE)
# 字符串格式(REG_SZ)修改:
winreg.SetValueEx(Key, "zifuchuan", 0, winreg.REG_SZ, 'zfc')  # 将`Key`下的`zifuchuan`值的数据修改为'zfc'
# 十六进制格式修改(REG_DWORD)
winreg.SetValueEx(Key, 'shiliujinzhi', 0, winreg.REG_DWORD, 0x00000001)  # 将`Key`下的`shiliujinzhi`值的数据修改为'0x00000001'
# 二进制格式修改(REG_BINARY)
jrx = b'abc'
winreg.SetValueEx(Key, 'erjinzhi', 0, winreg.REG_BINARY, jrx)  # 将`Key`下的`erjinzhi`值的数据修改为b'abc'
5.22.5.4 删除值
import winreg
from icecream import ic

HKCU = winreg.HKEY_CURRENT_USER
key = winreg.OpenKey(HKCU, r'test2\t2', 0, winreg.KEY_WRITE)
ic(winreg.DeleteValue(key, '新值'))

15:52:39|> winreg.DeleteValue(key, ‘新值’): None

你可能感兴趣的:(Python进阶,#,六,系统及相关操作,python,Windows,Python进阶,注册表)