Цикл через значения или раздел реестра.. winreg в языке Python

Как бы я прошел через все на значения раздела реестра Windows с использованием модуля Python _winreg. У меня есть код, который будет делать то, что я хочу, но это для подразделов указанного раздела реестра.


Вот Код:

from _winreg import *
t = OpenKey(HKEY_CURRENT_USER, r"PATH TO KEY", 0, KEY_ALL_ACCESS)

try:
    i = 0
    while True:
        subkey = EnumValue(t, i)
        print subkey
        i += 1
except WindowsError:
    # WindowsError: [Errno 259] No more data is available    
    pass

О, понял. Но, если кто-нибудь знает другой способ сделать это, я все-таки приму этот ответ!

3 ответов


не должно EnumValue быть здесь

# list all values for a key
try:
    count = 0
    while 1:
        name, value, type = _winreg.EnumValue(t, count)
        print repr(name),
        count = count + 1
except WindowsError:
    pass

предпочитаю избежать ошибки, вместо того, чтобы нырять прямо в него ...

использовать _winreg.QueryInfoKey чтобы получить количество значений:

import _winreg
key = _winreg.OpenKey(_winreg.HKEY_CURRENT_USER, r'PATH\TO\KEY', 0, _winreg.KEY_READ)

for i in xrange(0, _winreg.QueryInfoKey(key)[1]):
    print _winreg.EnumValue(key, i)

чтобы получить количество ключей, тот же метод, другой индекс (вторая половина исходного вопроса):

for i in xrange(0, _winreg.QueryInfoKey(key)[0]):
    print _winreg.EnumKey(key, i)

Примечание: использовать import вместо from ... import чтобы сделать его явным, откуда берутся функции и переменные. Делает его легче следовать код позже жизнь.


для перебора ключей и значений реестра, вам понадобится EnumKey() и EnumVlaue() метод _winreg модуль. Обратите внимание, что эти два метода принимают index в качестве аргумента и предоставляют вам ключ (или значение) только для данного индекса. Поэтому, чтобы получить все ключи( или значения), вам нужно увеличить индекс на один и продолжить до WindowsError не сталкивался.

этот пост может помочь вам для подробного понимания того же. Этот Ссылку на GitHub для кода можно найти в сообщении.