471,338 Members | 993 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,338 software developers and data experts.

Reading multiline values using ConfigParser

Hi,
I have a configfile, in fact, I am providing a configfile in the
format:

[Information]
Name: Foo
Author: Bar

Testcases:
tct123
tct124
tct101

The last values is a multi-line.

ConfigParser is unable to recognize a multi-line value and splits out
error.

C:\ATF-Tasks>python CreateTask.py
Traceback (most recent call last):
File "CreateTask.py", line 13, in ?
config.read('TaskDetails.txt')
File "C:\Python24\lib\ConfigParser.py", line 267, in read
self._read(fp, filename)
File "C:\Python24\lib\ConfigParser.py", line 490, in _read
raise e
ConfigParser.ParsingError: File contains parsing errors:
TaskDetails.txt
[line 15]: 'tct123\n'
[line 16]: 'tct124\n'
[line 17]: 'tct101\n'

I am using ConfigParser in the following way:

config = ConfigParser.ConfigParser()
config.read('TaskDetails.txt')
config.get("Information","Testcases"):

Is there anyway, I can include multi-line value in the configfile? I
was thinking of following option:value for a portion of the file and
read the portion with multi-line as a normal file, but ConfigParser()
is not allowing multi-line value itself.

Any ideas/ Suggestions? :

Ofcourse, throw away ConfigParser and use your own parser is there,
but I would like to use that as the last option.

Thanks,
Senthil

Jun 20 '07 #1
4 13028
On Jun 20, 10:35 pm, "John Krukoff" <jkruk...@ltgc.comwrote:
Is there anyway, I can include multi-line value in the configfile? I
>
Following the link to RFC 822 (http://www.faqs.org/rfcs/rfc822.html)
indicates that you can spread values out over multiple lines as long as
there is a space or tab character imeediately after the CRLF.
Thanks for the response. It did work!
>>config = ConfigParser()
config.read("Testcases.txt")
['Testcases.txt']
>>output = config.get("Information", "Testcases")
print output
tct123
tct124
tct125
>>output
'\ntct123\ntct124\ntct125'
>>>
However, as I am going to provide Testcases.txt to be "user editable",
I cannot assume or "ask users" to provide value testcases surronded by
spaces. I got to figure out a workaround here.

Thanks,
Senthil

Jun 21 '07 #2
On Thu, 2007-06-21 at 02:51 +0000, Phoe6 wrote:
On Jun 20, 10:35 pm, "John Krukoff" <jkruk...@ltgc.comwrote:
Is there anyway, I can include multi-line value in the configfile? I

Following the link to RFC 822 (http://www.faqs.org/rfcs/rfc822.html)
indicates that you can spread values out over multiple lines as long as
there is a space or tab character imeediately after the CRLF.

Thanks for the response. It did work!
>config = ConfigParser()
config.read("Testcases.txt")
['Testcases.txt']
>output = config.get("Information", "Testcases")
print output

tct123
tct124
tct125
>output
'\ntct123\ntct124\ntct125'
>>

However, as I am going to provide Testcases.txt to be "user editable",
I cannot assume or "ask users" to provide value testcases surronded by
spaces. I got to figure out a workaround here.
Since you don't actually need a multi-line entry but rather a list of
single-line entries, you could ask your users to enter something like
this:

TestcaseCount=3
Testcase1=tct123
Testcase2=tct124
Testcase3=tct125

HTH,

--
Carsten Haese
http://informixdb.sourceforge.net
Jun 21 '07 #3
Phoe6 wrote:
On Jun 20, 10:35 pm, "John Krukoff" <jkruk...@ltgc.comwrote:
>>Is there anyway, I can include multi-line value in the configfile? I
>Following the link to RFC 822 (http://www.faqs.org/rfcs/rfc822.html)
indicates that you can spread values out over multiple lines as long as
there is a space or tab character imeediately after the CRLF.

Thanks for the response. It did work!
>>>config = ConfigParser()
config.read("Testcases.txt")
['Testcases.txt']
>>>output = config.get("Information", "Testcases")
print output

tct123
tct124
tct125
>>>output
'\ntct123\ntct124\ntct125'

However, as I am going to provide Testcases.txt to be "user editable",
I cannot assume or "ask users" to provide value testcases surronded by
spaces. I got to figure out a workaround here.

Thanks,
Senthil
I do this a lot and implement it as:

[Testcases]
case_001=tct123
case_002=tct124
case_003=tct101

Then it is pretty easy to do something in my code like:

section='Testcases'
cases=[x for x in INI.options(section) if x.startswith('case_')]

for case in cases:
casefile=INI.get(section, case)
#
# Process each casefile here
#

-Larry
Jun 21 '07 #4
On Jun 21, 7:34 pm, "John Krukoff" <jkruk...@ltgc.comwrote:
Is there anyway, I can include multi-line value in the configfile? I
Following the link to RFC 822 (http://www.faqs.org/rfcs/rfc822.html)
indicates that you can spread values out over multiple lines as long as
there is a space or tab character imeediately after the CRLF.
Thanks for the response. It did work!
>>config = ConfigParser()
>>config.read("Testcases.txt")
['Testcases.txt']
>>output = config.get("Information", "Testcases")
>>print output
tct123
tct124
tct125
>>output
'\ntct123\ntct124\ntct125'
However, as I am going to provide Testcases.txt to be "user editable",
I cannot assume or "ask users" to provide value testcases surronded by
spaces. I got to figure out a workaround here.

Sounds like you're stuck modifying ConfigParser to do what you want, or
writing your own configuration file parsing utilities.
From looking through the ConfigParser source, looks like all the parsing

work is inside the _read method, so shouldn't be too painful to make a
subclass that does what you want.
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,op tname)

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 #5

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

2 posts views Thread by Thomas Guettler | last post: by
1 post views Thread by s99999999s2003 | last post: by
1 post views Thread by pipehappy | last post: by
reply views Thread by Mike Collins | last post: by
5 posts views Thread by Kevin Walzer | last post: by
4 posts views Thread by Hamish Moffatt | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.