how to parse windows inf files for python?

Question:

please help me.
example inf file :

;=============================================================================
;
; Copyright (c) Intel Corporation (2002).
;
; INTEL MAKES NO WARRANTY OF ANY KIND REGARDING THE CODE.  THIS CODE IS
; LICENSED ON AN "AS IS" BASIS AND INTEL WILL NOT PROVIDE ANY SUPPORT,
; ASSISTANCE, INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL DOES NOT
; PROVIDE ANY UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY
; DISCLAIMS ANY WARRANTY OF MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR ANY
; PARTICULAR PURPOSE, OR ANY OTHER WARRANTY.  Intel disclaims all liability,
; including liability for infringement of any proprietary rights, relating to
; use of the code. No license, express or implied, by estoppel or otherwise,
; to any intellectual property rights is granted herein.
;
;=============================================================================

; Installation inf for the Intel Corporation graphics adapter.

[Version]
Signature="$WINDOWS NT$"
Provider=%Intel%
ClassGUID={4D36E968-E325-11CE-BFC1-08002BE10318}
Class=Display
CatalogFile=i830mnt5.cat

DriverVer=08/20/2004,6.14.10.3889

[DestinationDirs]
DefaultDestDir   = 11
ialm.Miniport  = 12  ; drivers
ialm.Display   = 11  ; system32
Help.Copy = 11
CUI.Copy = 11
Uninstall_Copy = 11

OpenGL.Copy    = 11  ; OpenGL Drivers in System32

;
; Driver information
;

[Manufacturer]
%Intel%   = Intel.Mfg

[Intel.Mfg]
;830
;%i830M% = i830M, PCIVEN_8086&DEV_3577
%i830M% = i830M, PCIVEN_8086&DEV_3577&SUBSYS_00C81028
%i830M% = i830M, PCIVEN_8086&DEV_3577&SUBSYS_01221028
%i830M% = i830M, PCIVEN_8086&DEV_3577&SUBSYS_00B81028
%i830M% = i830M, PCIVEN_8086&DEV_3577&SUBSYS_00B91028
%i830M% = i830M, PCIVEN_8086&DEV_3577&SUBSYS_00F51028

;845
;%iBKDG% = i845G, PCIVEN_8086&DEV_2562
%iBKDG% = i845G, PCIVEN_8086&DEV_2562&SUBSYS_013D1028
%iBKDG% = i845G, PCIVEN_8086&DEV_2562&SUBSYS_01471028
%iBKDG% = i845G, PCIVEN_8086&DEV_2562&SUBSYS_03011028
%iBKDG% = i845G, PCIVEN_8086&DEV_2562&SUBSYS_013A1028
%iBKDG% = i845G, PCIVEN_8086&DEV_2562&SUBSYS_01481028
%iBKDG% = i845G, PCIVEN_8086&DEV_2562&SUBSYS_01381028
%iBKDG% = i845G, PCIVEN_8086&DEV_2562&SUBSYS_01261028
%iBKDG% = i845G, PCIVEN_8086&DEV_2562&SUBSYS_01271028
%iBKDG% = i845G, PCIVEN_8086&DEV_2562&SUBSYS_01331028
%iBKDG% = i845G, PCIVEN_8086&DEV_2562&SUBSYS_014B1028
%iBKDG% = i845G, PCIVEN_8086&DEV_2562&SUBSYS_01601028
%iBKDG% = i845G, PCIVEN_8086&DEV_2562&SUBSYS_01611028
%iBKDG% = i845G, PCIVEN_8086&DEV_2562&SUBSYS_01291028
%iBKDG% = i845G, PCIVEN_8086&DEV_2562&SUBSYS_01461028
%iBKDG% = i845G, PCIVEN_8086&DEV_2562&SUBSYS_03031028

;845GM
%iBKDGM% = i845GM, PCIVEN_8086&DEV_2562&SUBSYS_01491028

how to parse and formated “%iBKDGM% = i845GM, PCIVEN_8086&DEV_2562&SUBSYS_01491028” this line ?

Asked By: john misoskian

||

Answers:

You may try the built-in ConfigParser

http://docs.python.org/library/configparser.html

As well as ConfigObj

http://code.google.com/p/configobj/

Both claim to be able to handle Windows INI files.

Answered By: NerdyNick

Both configparser and configobj do not support parsing of INF files out of the box.

  1. in case of configparser there will be the following error:
configparser.DuplicateOptionError: While reading from 'Intel.inf' [line 49]: 
option '%i830m%' in section 'Intel.Mfg' already exists
  1. in case of ConfigObj there will be the following error:
configobj.ConfigObjError: Parsing failed with several errors.
First error at line 2.

A solution is to use wininfparser

import sys
from wininfparser import WinINF, INFsection

InfFile = WinINF()
InfFile.ParseFile("/path_to/Intel.inf")

s=InfFile['Intel.Mfg']
if s is None:
    print("Error: section not found!")
    sys.exit(-10)

s.SetKeyAutoSize(False)

s["%iBKDGM%"]="i845GM, PCIVEN_8086&DEV_2562&SUBSYS_01491028"
# or
# s.AddData("%iBKDGM%","i845GM, PCIVEN_8086&DEV_2562&SUBSYS_01491028")
InfFile.Save()

Results Intel.inf

............

[Intel.Mfg]
............
%iBKDG% = i845G, PCIVEN_8086&DEV_2562&SUBSYS_01461028
%iBKDG% = i845G, PCIVEN_8086&DEV_2562&SUBSYS_03031028
%iBKDGM% = i845GM, PCIVEN_8086&DEV_2562&SUBSYS_01491028
Answered By: arutar