By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
425,971 Members | 900 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 425,971 IT Pros & Developers. It's quick & easy.

New Thread- Supporting Multiline values in ConfigParser

P: n/a
Hi,
Am starting a new thread as I fear the old thread which more than a
week old can go unnoticed.
Sorry for the multiple mails.

I took the approach of Subclassing ConfigParser to support multiline
values without leading white-spaces, but am struct at which position
in _read I should modify to accomodate the non-leading whitespace
based multiline values.

I can guess, this portion in the _read function will require change,
any change to this affects the whole of parsing. :-( Can someone who
has done this before or understands ConfigParser better help me?

# Section I am talking about
if line[0].isspace() and cursect is not None
and optname:

value = line.strip()
if value:
cursect[optname] = "%s\n%s" %
(cursect[optname], value)

# _read method

def _read(self, fp, fpname):
cursect = None
optname = None
lineno = 0
e = None
while True:
line = fp.readline()
if not line:
break
lineno = lineno + 1
# comment or blank line?
if line.strip() == '' or line[0] in '#;':
continue
if line.split(None, 1)[0].lower() == 'rem' and
line[0] in "rR":
# no leading whitespace
continue
# continuation line
print "line:%s\tcursect:%s\toptname:%s"%
(line,cursect,optname)

if line[0].isspace() and cursect is not None
and optname:

value = line.strip()
if value:
cursect[optname] = "%s\n%s" %
(cursect[optname], value)
# a section header or option header?
else:
# is it a section header?
mo = self.SECTCRE.match(line)
if mo:
sectname = mo.group('header')
if sectname in self._sections:
cursect =
self._sections[sectname]
elif sectname ==
ConfigParser.DEFAULTSECT:
cursect =
self._defaults
else:
cursect =
{'__name__':sectname}

self._sections[sectname] = cursect
# So sections can't start with
a continuation line
optname = None
elif cursect is None:
raise
ConfigParser.MissingSectionHeaderError(fpname, lineno,
line)
# an option line?
else:
mo = self.OPTCRE.match(line)
if mo:
optname, vi, optval =
mo.group('option','vi','value')
if vi in ('=',':') and
';' in optval:
# ';' is a
comment delimiter only if it follows
# a spacing
character
pos =
optval.find(';')
if pos != -1
and optval[pos-1].isspace():
optval
= optval[:pos]
optval =
optval.strip()
# allow empty values
if optval == '""':
optval = ''
optname =
self.optionxform(optname.rstrip())
cursect[optname] =
optval
else:
if not e:
e =
ConfigParser.ParsingError(fpname)
e.append(lineno,
repr(line))
if e:
raise e

--
Senthil

Jun 25 '07 #1
Share this Question
Share on Google+
3 Replies


P: n/a
En Mon, 25 Jun 2007 11:06:04 -0300, Phoe6 <or*******@gmail.comescribió:
I took the approach of Subclassing ConfigParser to support multiline
values without leading white-spaces, but am struct at which position
in _read I should modify to accomodate the non-leading whitespace
based multiline values.
And how would you detect a multiline value?
Because it is not a section nor looks like a new option?
I can guess, this portion in the _read function will require change,
any change to this affects the whole of parsing. :-( Can someone who
has done this before or understands ConfigParser better help me?

# Section I am talking about
if line[0].isspace() and cursect is not None
and optname:

value = line.strip()
if value:
cursect[optname] = "%s\n%s" %
(cursect[optname], value)
Yes, I guess so.
I'd try using this:

if not self.SECTCRE.match(line) and not self.OPTCRE.match(line) and
cursect is not None and optname:

(that is, if the line is not a section header and it's not a new option
and there is a current section and option; those two last conditions same
as the previous version).
But you'll have to experiment - I've not tested it.

--
Gabriel Genellina

Jun 26 '07 #2

P: n/a
* Gabriel Genellina <ga*******@yahoo.com.ar[2007-06-25 22:26:47]:
And how would you detect a multiline value?
Because it is not a section nor looks like a new option?
I can guess, this portion in the _read function will require change,
any change to this affects the whole of parsing. :-( Can someone who
has done this before or understands ConfigParser better help me?

# Section I am talking about
if line[0].isspace() and cursect is not None
and optname:

value = line.strip()
if value:
cursect[optname] = "%s\n%s" %
(cursect[optname], value)

Yes, I guess so.
I'd try using this:

if not self.SECTCRE.match(line) and not self.OPTCRE.match(line) and
cursect is not None and optname:
Thanks Gabriel, this suggestion worked and helped me understand the
ConfigParser a bit better as well.

--
O.R.Senthil Kumaran
http://uthcode.sarovar.org
Jun 27 '07 #3

P: n/a
En Wed, 27 Jun 2007 01:35:27 -0300, O.R.Senthil Kumaran
<or*******@users.sourceforge.netescribió:
* Gabriel Genellina <ga*******@yahoo.com.ar[2007-06-25 22:26:47]:
>And how would you detect a multiline value?
Because it is not a section nor looks like a new option?

I'd try using this:

if not self.SECTCRE.match(line) and not self.OPTCRE.match(line) and
cursect is not None and optname:

Thanks Gabriel, this suggestion worked and helped me understand the
ConfigParser a bit better as well.
Good to know it worked - I was not entirely sure it would :)

--
Gabriel Genellina
Jun 27 '07 #4

This discussion thread is closed

Replies have been disabled for this discussion.