quickly read a formated file?

L

lialie

Hi,
Is there a fine way to read a formated file like:
%HEADER
title = "Untilted"
username = "User"

%DATA
.......
.......
The formated file may be very popularly, but the module ConfigPaser
doesn't handle it. Is there a way to process it freely?
 
B

bearophileHUGS

lialie:
The formated file may be very popularly, but the module ConfigPaser
doesn't handle it. Is there a way to process it freely?

First try, assuming the input file can be read whole. The code isn't
much readable, it needs better variable names (name names?), comments,
etc.

data = """
%HEADER
title1 = "Untilted1"
username = "User1"

%DATA
title2 = "Untilted2"
username2 = "User2"
"""

l1 = (p.strip().splitlines() for p in data.split("%") if p.strip())
result = {}
for part in l1:
pairs1 = (pair.split('=') for pair in part[1:])
pairs2 = ((k.strip(), v.strip().strip('"')) for k,v in pairs1)
result[part[0]] = dict(pairs2)
print result


All done lazily for your better comfort :)

Bye,
bearophile
 
R

rzed

(e-mail address removed) wrote in

lialie:
The formated file may be very popularly, but the module
ConfigPaser doesn't handle it. Is there a way to process it
freely?

First try, assuming the input file can be read whole. The code
isn't much readable, it needs better variable names (name
names?), comments, etc.

data = """
%HEADER
title1 = "Untilted1"
username = "User1"

%DATA
title2 = "Untilted2"
username2 = "User2"
"""

l1 = (p.strip().splitlines() for p in data.split("%") if
p.strip()) result = {}
for part in l1:
pairs1 = (pair.split('=') for pair in part[1:])
pairs2 = ((k.strip(), v.strip().strip('"')) for k,v in
pairs1) result[part[0]] = dict(pairs2)
print result

If there could be embedded perecent signs in the data, that will
produce some unexpected results, though. Here's another shot:

data = """
%HEADER
title1 = "Untilted1"
username = "User1"

%DATA
title2 = "The 7% Solution"
username2 = "User2"
"""

# Assumes there may be embedded percent signs in data
# and all data lines are of the form key = value
def parseData(data):
pd = {}
idata = iter(data)
for line in idata:
line = line.strip()
if line.startswith('%'):
tname = line[1:]
cd = pd[tname] = {}
line = idata.next().strip()
while line != '':
if line.find('=') > 0:
id,val = line.split('=',1)
cd[id.strip()] = val.strip().strip('"')
line = idata.next().strip()
return pd


print parseData(data.split('\n'))
 
J

Jussi Salmela

rzed kirjoitti:
(e-mail address removed) wrote in

lialie:
The formated file may be very popularly, but the module
ConfigPaser doesn't handle it. Is there a way to process it
freely?
First try, assuming the input file can be read whole. The code
isn't much readable, it needs better variable names (name
names?), comments, etc.

data = """
%HEADER
title1 = "Untilted1"
username = "User1"

%DATA
title2 = "Untilted2"
username2 = "User2"
"""

l1 = (p.strip().splitlines() for p in data.split("%") if
p.strip()) result = {}
for part in l1:
pairs1 = (pair.split('=') for pair in part[1:])
pairs2 = ((k.strip(), v.strip().strip('"')) for k,v in
pairs1) result[part[0]] = dict(pairs2)
print result

If there could be embedded perecent signs in the data, that will
produce some unexpected results, though. Here's another shot:


<snip>

The solution of bearophile only needs 2 small modifications to handle this:

#=========================================
data = """
%HEADER
title1 = "Untilted1"
username = "User1 20 %"

%DATA
title2 = "Untilted2"
username2 = "User2 10 %"
"""

# Ensure data starts with a newline
data = '\n' + data

# Split using '\n%' instead of '%'
l1 = (p.strip().splitlines() for p in data.split("\n%") if p.strip())
result = {}
for part in l1:
pairs1 = (pair.split('=') for pair in part[1:])
pairs2 = ((k.strip(), v.strip().strip('"')) for k,v in pairs1)
result[part[0]] = dict(pairs2)
print result
#=========================================



Cheers,
Jussi
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,989
Messages
2,570,207
Members
46,782
Latest member
ThomasGex

Latest Threads

Top