[Tutor] If/elif/else when a list is empty

Vince Spicer vince at vinces.ca
Tue Sep 14 06:56:38 CEST 2010


Tyler,

This is a simple error the KeyError is caused because the key isn't in the
dictionary
http://docs.python.org/library/exceptions.html#exceptions.KeyError and easy
fix you can either check for the key prior to using or use the get method

1) rgenre = re.split(r';', rf.info["genre"]) if "genre" in rf.info else []
the regex will never get executed here and an empty list will be returned if
genre not present

2) rgenre = re.split(r';', rf.info.get("genre", ''))
the get will not throw this error and return '' if ''genre' is not found in
the dictionary

Hope that helps,

Vince
<http://docs.python.org/library/exceptions.html#exceptions.KeyError>

On Mon, Sep 13, 2010 at 10:46 PM, <aeneas24 at priest.com> wrote:

> Hi Vince,
>
> Thanks very much for the one-line version--unfortunately, I still get
> errors. The overall script runs over every text file in a directory, but as
> soon as it hits a text file without a <genre> tag, it gives this error:
>
> Traceback (most recent call last):
>   File
> "C:\Users\tylersc\Desktop\Tyler2\Tyler\words_per_review_IMDB_9-13-10.py",
> line 168, in <module>
>     main(".","output.csv")
>   File
> "C:\Users\tylersc\Desktop\Tyler2\Tyler\words_per_review_IMDB_9-13-10.py",
> line 166, in main
>     os.path.walk(top_level_dir, reviewDirectory, writer )
>   File "C:\Python26\lib\ntpath.py", line 259, in walk
>     func(arg, top, names)
>   File
> "C:\Users\tylersc\Desktop\Tyler2\Tyler\words_per_review_IMDB_9-13-10.py",
> line 162, in reviewDirectory
>     reviewFile( dirname+'/'+fileName, args )
>   File
> "C:\Users\tylersc\Desktop\Tyler2\Tyler\words_per_review_IMDB_9-13-10.py",
> line 74, in reviewFile
>
>     rgenre = re.split(r';', rf.info["genre"])
> KeyError: 'genre'
>  I'm about to give what may be too much information--I really thought
> there must be a way to say "don't choke if you don't find any rgenres
> because rf.info["genre"] was empty". But maybe I need to define the "None"
> condition earlier?
>
> Basically a text file has this structure:
> <info>
> <title>High Noon</title>
> <genre>Drama;Western</genre> # But this tag doesn't exist for all text
> files
> # etc
> </info>
> <review>
> <author>u493498</author>
> <rating>9 out of 10</rating>
> <summary>A great flick</summary>
> <text>blah blah blah</text>
> # etc
> </review>
> # next review--all about the movie featured in the info tags
>
>
>
>
> -----Original Message-----
> From: Vince Spicer <vince at vinces.ca>
> To: aeneas24 at priest.com
> Cc: tutor at python.org
> Sent: Mon, Sep 13, 2010 9:08 pm
> Subject: Re: [Tutor] If/elif/else when a list is empty
>
>
>
> On Mon, Sep 13, 2010 at 9:58 PM, <aeneas24 at priest.com> wrote:
>
>> Hi,
>>
>> I'm parsing IMDB movie reviews (each movie is in its own text file). In my
>> script, I'm trying to extract genre information. Movies have up to three
>> categories of genres--but not all have a "genre" tag and that fact is making
>> my script abort whenever it encounters a movie text file that doesn't have a
>> "genre" tag.
>>
>> I thought the following should solve it, but it doesn't. The basic
>> question is how I say "if genre information doesn't at all, just make
>> rg1=rg2=rg3="NA"?
>>
>> rgenre = re.split(r';', rf.info["genre"]) # When movies have genre
>> information they store it as <genre>Drama;Western;Thriller</genre>
>>
>> if len(rgenre)>0:
>>           if len(rgenre)>2:
>>               rg1=rgenre[0]
>>               rg2=rgenre[1]
>>               rg3=rgenre[2]
>>           elif len(rgenre)==2:
>>               rg1=rgenre[0]
>>               rg2=rgenre[1]
>>               rg3="NA"
>>           elif len(rgenre)==1:
>>               rg1=rgenre[0]
>>               rg2="NA"
>>               rg3="NA"
>>    else len(rgenre)<1: # I was hoping this would take care of the "there
>> is no genre information" scenario but it doesn't
>>            rg1=rg2=rg3="NA"
>>
>> This probably does a weird nesting thing, but even simpler version I have
>> tried don't work.
>>
>> Thanks very much for any help!
>>
>> Tyler
>>
>>
>>
>> _______________________________________________
>> Tutor maillist  -  Tutor at python.org
>> To unsubscribe or change subscription options:
>> http://mail.python.org/mailman/listinfo/tutor
>>
>>
> Hey Tyler you can simplify this with a onliner.
>
>  rg1, rg2, rg3 = rgenre + ["NA"]*(3-len(rgenre[:3]))
>
>  Hope that helps, if you have any questions feel free to ask.
>
>  Vince
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20100913/2300e61c/attachment-0001.html>


More information about the Tutor mailing list