Sathy
Sathy

Reputation: 303

IndexError: list index out of range; split is causing the issue probably

I am just two days to Python and also to this Forum. Please bear if my question looks silly. I tried searching the stack overflow, but couldn't correlate the info whats been given.

Please help me on this

   >>> import re
   >>> file=open("shortcuts","r")
   >>> for i in file:
   ...  i=i.split(' ',2)
   ...  if i[1] == '^/giftfordad$':
   ...   print i[1]
   ...
   ^/giftfordad$
   Traceback (most recent call last):
   File "<stdin>", line 3, in <module>
   IndexError: list index out of range

I am receiving my desire output but along with list index out of range error. My file shortcuts contains four columns which are delimited with SPACE.

Also please help me how to find the pattern if the value resides in a variable. For example

var1=giftcard

How to find ^/var$ in my file. Thanks for help in advance.

From Jon's point, I arrive at this. But still looking for answer. the below gives me an empty result. Need some tweak in regex for [^/ and $]

    >>> import re
    >>> with open('shortcut','r') as fin:
    ...  lines =  (line for line in fin if line.strip() and not line.strip().startswith('#'))
    ...  for line in lines:
    ...   if re.match("^/giftfordad$",line):
    ...    print line

From my shell command, i arrive at the answer easily. Can somebody please write/correct this piece of code achieving the results, I'm looking for. Many thanks

    $grep "\^\/giftfordad\\$" shortcut
    RewriteRule ^/giftfordad$ /home/sathya/?id=456 [R,L]

Upvotes: 0

Views: 2719

Answers (2)

Emmanuel
Emmanuel

Reputation: 14209

I took the line you gave as an example, and here is what I found, hoping that fits your expectations (I understood you wanted to replace ^/tv$ by ^/giftfordad$ in column #2):

>>> s = 'RewriteRule ^/tv$ /home/sathya?id=123 [R=301,L]'
>>> parts = s.split()
>>> parts
['RewriteRule', '^/tv$', '/home/sathya?id=123', '[R=301,L]']
>>> if len(parts) > 1:
    part = parts[1]
    if not "^/giftfordad$" in part:
        print ' '.join([parts[0]] + ["^/giftfordad$"] +  parts[2:])
    else:
        print s    

RewriteRule ^/giftfordad$ /home/sathya?id=123 [R=301,L]

The line with join is the most complex: I recreate a list by concatenating:

  • the 1st column unchanged
  • the 2nd column replaced by ^/giftfordad$
  • the rest of the columns unchanged

join is then used to join all these elements as a string.

Upvotes: 0

Jon Clements
Jon Clements

Reputation: 142126

In this:

i=i.split(' ',2)
if i[1] == '^/giftfordad$':

It would imply that i is now a list of length 1 (ie, there was no ' ' character to split on).

Also, it looks like you might be trying to use a regular expression and if i[1] == '^/giftfordad$' is not the way Python does those. That comparison would be written as:

if i[1] == '/giftfordad':

However, that's a completely valid string if you're grabbing it from a file of a list of regular expressions ;)

Just seen your example:

If you're processing an .htaccess like file, you'll want to ignore blank lines and presumably commented lines...

with open('shortcuts') as fin:
    lines =  (line for line in fin if line.strip() and not line.strip().startswith('#'))
    for line in lines:
        stuff = line.split(' ', 2)
        # etc...

Upvotes: 1

Related Questions