Inconsistency with split() - Script, OS, or Package Problem?
Terry Reedy
tjreedy at udel.edu
Mon May 9 16:46:02 EDT 2011
On 5/9/2011 2:10 PM, James Wright wrote:
> Hello,
>
> I have been using a script on several boxes that have been around for
> a while, and everything works just fine. I am finding though, that on
> some new OS installs the script fails with:
>
> Traceback (most recent call last):
> File "render4.py", line 114, in<module>
> create_report_index(each_item)
> File "render4.py", line 25, in create_report_index
> [clean_name, _] = each_value.split('_', 1)
> ValueError: need more than 1 value to unpack
What this means is that at some point you tried to split a string that
does not have an underscore to print on.
>>> [s,_] = 'no underscore'.split('_',1)
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
[s,_] = 'no underscore'.split('_',1)
ValueError: need more than 1 value to unpack
> The OS's are various OpenSuse installs from 10.3 to 11.4. It works on
> all the existing ones, which leads me to believe that I have a package
> or configuration inconsistency. It should be noted though that I am
> quite new to python programming and very well could have coded in a
> non-portable manner and was just lucky to get it working in the first
> place :)
Your code is fine. The question is,"How could, or why, would new
installs result in invalid inputs?"
> Here is the code snippet that generates the failure ( when you look
> at this remember that I am a novice :-) ):
>
> for each_item in D4: #D4 is a dictionary
> create_report_index(each_item)
I might write 'for key in D4:' which makes it obvious that D4 is a dict
and that you are iterating through its keys. Or 'for report_name...'
> def create_report_index(report): #Here we are creating a simple
> index.html file from data in a text file
> newfile = open(report + '.html', 'w') #Create the index file using
> report name
> for each_value in D4[report]:
For debugging, add
if '_' not in each_value:
print(report, D4[report], each_value
> [clean_name, _] = each_value.split('_', 1)
> newfile.write('<a href="' + report +'//' + each_value +
> '/index.htm">' + clean_name +'</a><BR>\n')
Once you find the offending input, then investigate its source in the
code that creates D4. Your other questions are premature. If a
no_underscore each_value is wrong, fix the source. If you decide that
such are actually ok, then fix the code above:
if '_' in each_value:
clean_name = each_value.split('_', 1)
else:
clean_name = each_value
--
Terry Jan Reedy
More information about the Python-list
mailing list