parse a string of parameters and values

Steven D'Aprano steve at REMOVE-THIS-cybersource.com.au
Sat Dec 12 22:27:49 EST 2009


On Sat, 12 Dec 2009 16:16:32 -0800, bsneddon wrote:

> I have a problem that I can come up with a brute force solution to solve
> but it occurred to me that there may be an
>  "one-- and preferably only one --obvious way to do it".

I'm not sure that "brute force" is the right description here. Generally, 
"brute force" is used for situations where you check every single 
possible value rather than calculate the answer directly. One classical 
example is guessing the password that goes with an account. The brute 
force attack is to guess every imaginable password -- eventually you'll 
find the matching one. A non-brute force attack is to say "I know the 
password is a recent date", which reduces the space of possible passwords 
from many trillions to mere millions.

So I'm not sure that brute force is an appropriate description for this 
problem. One way or another you have to read every line in the file. 
Whether you read them or you farm the job out to some pre-existing 
library function, they still have to be read.


> I am going to read a text file that is an export from a control system.
> It has lines with information like
> 
> base=1 name="first one" color=blue
> 
> I would like to put this info into a dictionary for processing. 

Have you looked at the ConfigParser module?

Assuming that ConfigParser isn't suitable, you can do this if each 
key=value pair is on its own line:


d = {}
for line in open(filename, 'r'):
    if not line.strip():
        # skip blank lines
        continue
    key, value = line.split('=', 1)
    d[key.strip()] = value.strip()


If you have multiple keys per line, you need a more sophisticated way of 
splitting them. Something like this should work:

d = {}
for line in open(filename, 'r'):
    if not line.strip():
        continue
    terms = line.split('=')
    keys = terms[0::2]  # every second item starting from the first
    values = terms[1::2]  # every second item starting from the second
    for key, value in zip(keys, values):
        d[key.strip()] = value.strip()




-- 
Steven



More information about the Python-list mailing list