Re: perl better than python for users with disabilities?

2006-12-20 Thread johnzenger
Blind programmers can use braille displays, which let them perceive
indentation as easily as sighted programmers can.  http://xrl.us/tydj

As for people with physical disabilities that have trouble typing, a
Python-aware editor does the identation for you, so all you have to do
is type a colon and an enter, then a backspace when you are done being
indented.

But it's an interesting question, and I'd like to hear from blind
programmers about how program language design can make their lives
easier or more difficult.

On Dec 20, 11:11 am, Dan Jacobson [EMAIL PROTECTED] wrote:
 Can I feel even better about using perl vs. python, as apparently
 python's dependence of formatting, indentation, etc. vs. perl's
 (){}; etc. makes writing python programs perhaps very device
 dependent. Whereas perl can be written on a tiny tiny screen, and can
 withstand all kinds of users with various disabilities, etc.?
 Also perl is easier to squeeze into makefiles.

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: error with IDLE on debian

2006-12-20 Thread johnzenger
Just a guess, but I think you need to be using at least Python 2.4 if
you are going to use IDLE version 2.4.4-2.

On Dec 20, 1:16 pm, altern [EMAIL PROTECTED] wrote:
 Hi

 when i try to run IDLE on my debian laptop I get this error.

 $ idle
 Traceback (most recent call last):
File /usr/bin/idle, line 5, in ?
  main()
File idlelib/PyShell.py, line 1359, in main
File idlelib/FileList.py, line 44, in new
File idlelib/PyShell.py, line 105, in __init__
File idlelib/EditorWindow.py, line 111, in __init__
File /usr/lib/python2.4/lib-tk/Tkinter.py, line 2764, in __init__
  Widget.__init__(self, master, 'text', cnf, kw)
File /usr/lib/python2.4/lib-tk/Tkinter.py, line 1865, in __init__
  self.tk.call(
 _tkinter.TclError: expected integer but got `100

 I am not sure about what could cause the problem because I didnt use my
 laptop for python programming for couple of weeks. Before that it worked
 fine. And on that period i might have installed few things.

 I am running Debian unstable with python 2.2.4, tcl8.4, tk8.4, python-tk
 24.4-1 and IDLE 2.4.4-2. I already tried to reinstall IDLE, tk and tcl
 and python-tk but that did not solve anything, i keep getting the same
 error.
 
 any ideas?
 
 thanks
 
 enrike

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: What am I supposed to do with an egg?!

2006-12-19 Thread johnzenger
Type sudo easy_install myeggfile.egg.

If that gives you an error, then you don't have easy_install installed.
 Install it this way:

sudo apt-get install python-setuptools

On Dec 19, 3:44 pm, Morpheus [EMAIL PROTECTED] wrote:
 On Windows I'm used to install packages by setup.py install. So did I with
 Fibranet nanothreads - a few seconds and it was installed.

 On Linux (ubuntu 6.06) all I could get at is an egg file. I found out that
 I have to exec easy_install, which didn't much help here (seems to me, at
 least - sorry, Linux newbie).
 
 So, what am I supposed to do here now?
 
 Kind regards
 Morpheus

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: regexp

2006-12-19 Thread johnzenger
You want re.sub((?s)!--.*?--, , htmldata)

Explanation:  To make the dot match all characters, including newlines,
you need to set the DOTALL flag.  You can set the flag using the (?_)
syntax, which is explained in section 4.2.1 of the Python Library
Reference.

A more readable way to do this is:

obj = re.compile(!--.*?--, re.DOTALL)
re.sub(, htmldata)


On Dec 19, 3:59 pm, vertigo [EMAIL PROTECTED] wrote:
 Hello





  On Tuesday 19 December 2006 13:15, vertigo wrote:
  Hello

  I need to use some regular expressions for more than one line.
  And i would like to use some modificators like: /m or /s in perl.
  For example:
  re.sub(script.*.*/script,,data)

  will not cut out all javascript code if it's spread on many lines.
  I could use something like /s from perl which treats . as all signs
  (including new line). How can i do that ?

  Maybe there is other way to achieve the same results ?

  Thanx

  Take a look at Chapter 8 of 'Dive Into Python.'
 http://diveintopython.org/toc/index.htmli read whole regexp chapter - but 
 there was no solution for my problem.
 Example:

 re.sub(!--.*--,,htmldata)
 would remove only comments which are in one line.
 If comment is in many lines like this:
 !--start
 of
 commend, end--

 it would not work. It's because '.' sign does not matches '\n' sign.

 Does anybody knows solution for this particular problem ?
 
 Thanx- Hide quoted text -- Show quoted text -

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: regexp

2006-12-19 Thread johnzenger
Oops, I mean obj.sub(, htmldata)

On Dec 19, 4:15 pm, [EMAIL PROTECTED] wrote:
 You want re.sub((?s)!--.*?--, , htmldata)

 Explanation:  To make the dot match all characters, including newlines,
 you need to set the DOTALL flag.  You can set the flag using the (?_)
 syntax, which is explained in section 4.2.1 of the Python Library
 Reference.

 A more readable way to do this is:

 obj = re.compile(!--.*?--, re.DOTALL)
 re.sub(, htmldata)

 On Dec 19, 3:59 pm, vertigo [EMAIL PROTECTED] wrote:



  Hello

   On Tuesday 19 December 2006 13:15, vertigo wrote:
   Hello

   I need to use some regular expressions for more than one line.
   And i would like to use some modificators like: /m or /s in perl.
   For example:
   re.sub(script.*.*/script,,data)

   will not cut out all javascript code if it's spread on many lines.
   I could use something like /s from perl which treats . as all signs
   (including new line). How can i do that ?

   Maybe there is other way to achieve the same results ?

   Thanx

   Take a look at Chapter 8 of 'Dive Into Python.'
  http://diveintopython.org/toc/index.htmliread whole regexp chapter - but 
  there was no solution for my problem.
  Example:

  re.sub(!--.*--,,htmldata)
  would remove only comments which are in one line.
  If comment is in many lines like this:
  !--start
  of
  commend, end--

  it would not work. It's because '.' sign does not matches '\n' sign.

  Does anybody knows solution for this particular problem ?

  Thanx- Hide quoted text -- Show quoted text -- Hide quoted text -- Show 
  quoted text -

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: regexp

2006-12-19 Thread johnzenger
Not just Python, but every Regex engine works this way.  You want a ?
after your *, as in --(.*?)-- if you want it to catch the first
available --.

At this point in your adventure, you might be wondering whether regular
expressions are more trouble than they are worth.  They are.  There are
two libraries you need to take a look at, and soon:  BeautifulSoup for
parsing HTML, and PyParsing for parsing everything else.  Take the time
you were planning to spend on deciphering regexes like
(\d{1,3}\.){3}\d{1,3} and spend it learning the basics of those
libraries instead -- you will not regret it.

On Dec 19, 4:39 pm, vertigo [EMAIL PROTECTED] wrote:
 Hello

 Thanx for help, i have one more question:

 i noticed that while matching regexp python tries to match as wide as it's
 possible,
 for example:
 re.sub(!--.*--,,htmldata)
 would cut out everything before first !-- and last -- in the
 document.
 Can i force re to math as narrow as possible ?
 (to match first !-- with the first -- after the !-- and to repeat
 this procedure while mentioned pattern is still found) ?
 
 Thanx

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: a quickie: range - x

2006-11-29 Thread johnzenger
(x for x in xrange(N+1) if x != m)

rjtucke wrote:
 I want an iterable from 0 to N except for element m (=M).
 I could write
 x = range(N)
 x.remove(m)
 but I want it in one expression.
 
 Thanks,
 Ross

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Ruby/Python/REXX as a MUCK scripting language

2006-11-26 Thread johnzenger
Have you considered JavaScript Spidermonkey or JavaScript Rhino?
Sandboxing is automatic, and lots of people know the language already
(although fewer people are familiar with its dynamic object-oriented
capabilities).

Tony Belding wrote:
 I'm interested in using an off-the-shelf interpreted language as a
 user-accessible scripting language for a MUCK.  I'm just not sure if I
 can find one that does everything I need.  The MUCK must be able to
 call the interpreter and execute scripts with it, but the interpreter
 must also be able to call functions in the MUCK code.  And then there's
 the security issue that really worries me. . .  I have to be able to
 limit what the interpreter can execute.  I can't have my users running
 scripts that access the console, access the filesystem or sockets
 directly, or call libraries or other binaries outside the MUCK.

 Is this practical?  I'm thinking of Ruby or Python for this, if they
 can meet the requirements.

 I might even consider REXX. . .  I remember ARexx from my Amiga days,
 and how great it was for string manipulation and application scripting.
  However. . .  My immediate target platform, Mac OS X, comes with Ruby
 and Python but not REXX, so that's a disadvantage.

 My final option would be to create my own language interpeter where I
 have control over everything that happens.  That is what MUCKs have
 always done in the past.  But the result was always quirky, limited
 languages like MUF (Multi-User Forth) which really turn off a lot of
 coders.  Furthermore, I've never created a language before, and it
 would be a lot of extra work for me.
 
 -- 
 Tony Belding, Hamilton Texas

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Python and CMS

2006-10-22 Thread johnzenger
For a free out of the box solution, look at MoinMoin.  It is wiki
software, but nothing stops you from turning off user signups, locking
down the whole site, and just using it as a CMS.  It's very easy to set
up, can run as a CGI, and requires no database backend.

Echo wrote:
 I am going to start working on a church website. And since I like
 python, I decided to use WSGI. However, I later found out about all
 the different CMS's in php. So I wondered if there where any in
 python.

 Sadly, I only found Plone, skeletonz, and PyLucid (If there is any
 more, please let me know). Of those three, only PyLucid supports WSGI
 and it didn't look very nice to me.
 Both Plone and skeletonz looked very nice. However, they can't be
 hosted on a regular web host(at least to my knowledge) since they run
 as the web server themselves. So hosting would cost more, at least 2-3
 times more from what I've seen.

 So I'm thinking of making a python CMS based on WSGI. I'm now trying
 to figure out a few things like the best way to store the content and
 how to manage/use plugins. For storing the content, the only ways I
 know of are as files or in a database. But I'm not sure what would be
 better. And as for how to do plugings, I plan on looking at Plone and
 skeletonz.

 As for working with WSGI, I have found
 Colubrid(http://wsgiarea.pocoo.org/colubrid/) and
 Paste(http://pythonpaste.org/). I was wondering if anyone knew of any
 other libraries that make working with WSGI easier. Also, I wondering
 if anyone would like to share their experiences of working with those.


 ps. I know that this is a big and complicated project. But no matter
 how far I get, it will be fun because its Python:)

 --
 Now that I am a Christian I do not have moods in which the whole
 thing looks very improbable: but when I was an atheist I had moods in
 which Christianity looked terribly probable.
   -C. S. Lewis
 
 -Echo

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: why does this unpacking work

2006-10-20 Thread johnzenger
It's just sequence unpacking.  Did you know that this works?:

pair = (California,San Francisco)
state, city = pair
print city
# 'San Francisco'
print state
# 'California'

John Salerno wrote:
 I'm a little confused, but I'm sure this is something trivial. I'm
 confused about why this works:

   t = (('hello', 'goodbye'),
   ('more', 'less'),
   ('something', 'nothing'),
   ('good', 'bad'))
   t
 (('hello', 'goodbye'), ('more', 'less'), ('something', 'nothing'),
 ('good', 'bad'))
   for x in t:
   print x


 ('hello', 'goodbye')
 ('more', 'less')
 ('something', 'nothing')
 ('good', 'bad')
   for x,y in t:
   print x,y


 hello goodbye
 more less
 something nothing
 good bad
  

 I understand that t returns a single tuple that contains other tuples.
 Then 'for x in t' returns the nested tuples themselves.

 But what I don't understand is why you can use 'for x,y in t' when t
 really only returns one thing. I see that this works, but I can't quite
 conceptualize how. I thought 'for x,y in t' would only work if t
 returned a two-tuple, which it doesn't.

 What seems to be happening is that 'for x,y in t' is acting like:

 for x in t:
  for y,z in x:
  #then it does it correctly

 But if so, why is this? It doesn't seem like very intuitive behavior.
 
 Thanks.

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Decorators and how they relate to Python - A little insight please!

2006-10-19 Thread johnzenger
When you want to repeatedly apply a certain ALGORITHM to arbitrary sets
of DATA, you write a FUNCTION.

When you want to add a certain BEHAVIOR to arbitrary sets of FUNCTIONS,
you write a DECORATOR.

An excellent use of decorators is in Django, the web programming
framework.  Django keeps track of usernames and passwords for you.
Occasionally, there are some things on your web site that you only want
to only let people who are logged in do (like, say, leave a comment on
your blog).  Instead of making you begin every such function with if
user_is_logged in: or some similar abomination, Django lets you just
put a @require_login decorator before that function.  Pretty spiffy.


Jerry wrote:
 I have just started to do some semi-serious programming (not one-off
 specialized scripts) and am loving Python.  I just seem to get most of
 the concepts, the structure, and the classes (something I struggled
 with before in other languages).  I've seen many concepts on the web
 (i.e. stacks, queues, linked lists) and can usually understand them
 pretty well (event if I don't always know when to use them).  Now I've
 come accross decorators and even though I've read the PEP and a little
 in the documentation, I just don't get what they are or what problem
 they are trying to solve.  Can anyone please point me to a general
 discussion of decorators (preferrably explained with Python)?
 
 Thanks,
 Jerry

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Regular expression worries

2006-10-11 Thread johnzenger
You are opening the same file twice, reading its contents line-by-line
into memory, replacing Document with Doc *in memory*, never writing
that to disk, and then discarding the line you just read into memory.

If your file is short, you could read the entire thing into memory as
one string using the .read() method of fh (your file object).  Then,
call .replace on the string, and then write to disk.

If your file is long, then you want to do the replace line by line,
writing as you go to a second file.  You can later rename that file to
the original file's name and delete the original.

Also, you aren't using regular expressions at all.  You do not
therefore need the re module.

CSUIDL PROGRAMMEr wrote:
 folks
 I am new to python, so excuse me if i am asking stupid questions.

 I have a txt file  and here are some lines of it

 DocumentKeyworddate:2006-08-19 Keywordtime:11:00:43
 Keywordusername:YOURBOTNICK Keyworddata:localhost.localdomain
 Keywordlogon:localhost.localdomain
Keyworddate:2006-08-19 Keywordtime:11:00:44 Keywordsender:
 Keywordreceiver: Keyworddata::+iwx Keywordmode::+iwx

 I am writing a python program to replace the tags and word  Document
 with Doc.

 Here is my python program

 #! /usr/local/bin/python

 import sys
 import string
 import re

 def replace():
   filename='/root/Desktop/project/chatlog_20060819_110043.xml.txt'
   try:
 fh=open(filename,'r')
   except:
 print 'file not opened'
 sys.exit(1)
   for  l in
 open('/root/Desktop/project/chatlog_20060819_110043.xml.txt'):

   l=l.replace(Document, DOC)
   fh.close()

 if __name__==__main__:
   replace()

 But it does not replace Document with Doc in  the txt file
 
 Is there anything wrong i am doing
 
 thanks

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: extract certain values from file with re

2006-10-06 Thread johnzenger
Can you safely assume that the lines you want to extract all contain
numbers, and that the lines you do not wish to extract do not contain
numbers?

If so, you could just use the Linux grep utility:  grep '[0123456789]'
filename

Or, in Python:

import re
inf = file(your-filename-here.txt)
outf = file(result-file.txt,w)
digits = re.compile(\d)

for line in inf:
   if digits.search(line): outf.write(line)
outf.close()
inf.close()

As for your more difficult file, take a look at the CSV module.  I
think that by changing the delimiter from a comma to a |, you will be
95% of the way to your goal.

Fabian Braennstroem wrote:
 Hi,

 I would like to remove certain lines from a log files. I had
 some sed/awk scripts for this, but now, I want to use python
 with its re module for this task.

 Actually, I have two different log files. The first file looks
 like:

...
'some text'
...

ITER I- GLOBAL ABSOLUTE RESIDUAL -I  
 I FIELD VALUES AT MONITORING LOCATION  --I
 NOUMOM VMOM WMOM MASS T EN DISS ENTH  
  UVWP   TE   EDT
  1  9.70E-02 8.61E-02 9.85E-02 1.00E+00 1.61E+01 7.65E+04 0.00E+00  
 1.04E-01-8.61E-04 3.49E-02 1.38E-03 7.51E-05 1.63E-05 2.00E+01
  2  3.71E-02 3.07E-02 3.57E-02 1.00E+00 3.58E-01 6.55E-01 0.00E+00  
 1.08E-01-1.96E-03 4.98E-02 7.11E-04 1.70E-04 4.52E-05 2.00E+01
  3  2.64E-02 1.99E-02 2.40E-02 1.00E+00 1.85E-01 3.75E-01 0.00E+00  
 1.17E-01-3.27E-03 6.07E-02 4.02E-04 4.15E-04 1.38E-04 2.00E+01
  4  2.18E-02 1.52E-02 1.92E-02 1.00E+00 1.21E-01 2.53E-01 0.00E+00  
 1.23E-01-4.85E-03 6.77E-02 1.96E-05 9.01E-04 3.88E-04 2.00E+01
  5  1.91E-02 1.27E-02 1.70E-02 1.00E+00 8.99E-02 1.82E-01 0.00E+00  
 1.42E-01-6.61E-03 7.65E-02 1.78E-04 1.70E-03 9.36E-04 2.00E+01
...
...
...

   2997  3.77E-04 2.89E-04 3.05E-04 2.71E-02 5.66E-04 6.28E-04 0.00E+00 
 -3.02E-01 3.56E-02-7.97E-02-7.11E-02 4.08E-02 1.86E-01 2.00E+01
   2998  3.77E-04 2.89E-04 3.05E-04 2.71E-02 5.65E-04 6.26E-04 0.00E+00 
 -3.02E-01 3.63E-02-8.01E-02-7.10E-02 4.02E-02 1.83E-01 2.00E+01
   2999  3.76E-04 2.89E-04 3.05E-04 2.70E-02 5.64E-04 6.26E-04 0.00E+00 
 -3.02E-01 3.69E-02-8.04E-02-7.10E-02 3.96E-02 1.81E-01 2.00E+01
   3000  3.78E-04 2.91E-04 3.07E-04 2.74E-02 5.64E-04 6.26E-04 0.00E+00 
 -3.01E-01 3.75E-02-8.07E-02-7.09E-02 3.91E-02 1.78E-01 2.00E+01
   --  
 


'some text'


 I actually want to extract the lines with the numbers, write
 them to a file and finally use gnuplot for plotting them. A
 nicer and more python way would be to extract those numbers,
 write them into an array according to their column and plot
 those using the gnuplot or matplotlib module :-)

 Unfortunately, I am pretty new to the re module and tried
 the following so far:


   import re
   pat = re.compile('\ \ \ NO.*?', re.DOTALL)
   print re.sub(pat, '', open('log_star_orig').read())


 but this works just the other way around, which means that
 the original log file is printed without the number part. So
 the next step would be to delete the part from the first
 line to '\ \ \ \ NO' and the part from '' to the end,
 but I do not know how to address the first and last line!?

 Would be nice, if you can give me a hint and especially
 interesting would it be, when you have an idea, how I can
 put those columns in arrays, so I can plot them right away!


 A more difficult log file looks like:

  ==
  OUTER LOOP ITERATION =1 CPU SECONDS = 2.40E+01
  --
  |   Equation   | Rate | RMS Res | Max Res |  Linear Solution |
  +--+--+-+-+--+
  | U-Mom| 0.00 | 1.0E-02 | 5.0E-01 |   4.9E-03  OK|
  | V-Mom| 0.00 | 2.4E-14 | 5.6E-13 |   3.8E+09  ok|
  | W-Mom| 0.00 | 2.5E-14 | 8.2E-13 |   8.3E+09  ok|
  | P-Mass   | 0.00 | 1.1E-02 | 3.4E-01 |  8.9  2.7E-02  OK|
  +--+--+-+-+--+
  | K-TurbKE | 0.00 | 1.8E+00 | 1.8E+00 |  5.8  2.2E-08  OK|
  | E-Diss.K | 0.00 | 1.9E+00 | 2.0E+00 | 12.4  2.2E-08  OK|
  +--+--+-+-+--+

  ==
  OUTER LOOP ITERATION =2 CPU SECONDS = 8.57E+01
  --
  |   Equation   | Rate | RMS Res | Max Res |  Linear Solution |
  +--+--+-+-+--+
  | U-Mom| 1.44 | 1.5E-02 | 5.3E-01 |   9.6E-03  OK|
  

Copyright lawyer advises be careful using Python?

2006-09-26 Thread johnzenger
I was scanning the 9/13/2006 issue of the Electronic Commerce  Law
Report, which is a newsletter for lawyers published by BNA.  They have
an article headlined Game Developers Making Tomorrow's Hits Face Host
of Copyright Issues Along the Way, and the article is mostly a writeup
of a speech given by Paul Tauger, identified as an IP attorney with
Schnader Harrison Segal  Lewis LLP, San Francisco.  It contains this
final paragraph:

Be Careful Using Open Source Tools.  Game developers are under
constant pressure to deliver games under tight deadlines.  Open source
software tools can help speed the development process, but may carry
with them certain legal risks, Tauger explained.  One open source tool
popular with the game development community is Python.  Unfortunately,
the Python Software Foundation's license agreement leaves a lot of
unanswered questions about the origin and precise ownership of the
tool's code.  The license refers to six separate entities that, at one
point or another, contributed to the tool's development.  PSF's license
disclaims any warranties of non-infringement and disavows any
indemnification obligation.  In theory, if some aspect of Python was
deemed to infringe copyrighted code, it could create legal headaches
for game developers who rely upon the tool to build certain parts of
their games.  'Be aware of the risks attendant,' Tauger said.  (page
914)

What is our response?  Is the PSF that much different from any other
open source license?  Can anyone identify everyone who ever contributed
to the Linux source code?  Does ANY free tool indemnify people?  In
fact, does Microsoft indemnify Visual Studio users against the risk
that one day the BASIC language will be found to have been infringing a
patent all along?

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: iterator question

2006-09-26 Thread johnzenger
def transform(seq, size):
i = 0
while i  len(seq):
yield tuple(seq[i:i+size])
i += size

Neal Becker wrote:
 Any suggestions for transforming the sequence:

 [1, 2, 3, 4...]
 Where 1,2,3.. are it the ith item in an arbitrary sequence

 into a succession of tuples:

 [(1, 2), (3, 4)...]

 In other words, given a seq and an integer that specifies the size of tuple
 to return, then for example:

 seq = [a,b,c,d,e,f]
 for e in transform (seq, 2):
   print e
 
 would return
 (a,b)
 (c,d)
 (e,f)

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Splitting device addresses into parts

2006-09-26 Thread johnzenger
This may be a rare case where regular expressions are not a horrible,
self-defeating idea.  Something like:

delimiter = re.compile([:\.])
delimiter.split(PCI:2:3.0)
...and then ignore the first entry, and map int the rest.
Alternatively, if the delimiters can really be anything, and if there
are no numbers in the first space (PCI), then maybe this approach:

number = re.compile(\d+?)
number.findall(PCI:2:3.0)

Fabian Steiner wrote:
 Bruno Desthuilliers wrote:
  Fabian Steiner wrote:
  I often have to deal with strings like PCI:2:3.0 or PCI:3.4:0 and
  need the single numbers as tuple (2, 3, 0) or (3, 4, 0). Is there any
  simple way to achieve this? So far I am using regular expressions but I
  would like to avoid them ...
 
  devices = [PCI:2:3.0, PCI:3.4:0]
  for d in device:
nums = tuple(map(int, d.split(':')[1:]))
print for , d,  : , nums

 Unfortunately, this doesn't work (even if I correct your typos) since
 the delimeter isn't necessary a colon - that's exactly the difficulty I
 am trying to solve.
 
 Regards,
 Fabian Steiner

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Query regarding grep!!

2006-09-26 Thread johnzenger
You could also use itertools:

import itertools
import re

find = re.compile(pattern)
for line in itertools.ifilter(lambda x: find.search(x),
file(filepath)):
print line

Fredrik Lundh wrote:
 bhavya sg wrote:

   I saw in PEP4 of python 2.5 that grep module has gone
  obsolete in perl 2.5. But I am not able to find an
  alternative for that.

 the grep module has been deprecated for ages (it's been in the lib-old
 non-standard library since at least Python 2.1).  The old grep module
 depends on the regex module, which has been deprecated since Python 1.6,
 and which was finally removed in Python 2.5.

   My doubt is are the other forms of grep like egrep and ggrep be used
   instead?

 there are no such modules in Python, afaik.

 (and that's a question, not a doubt, right?)

 if you have Python code that uses the grep module, you can replace it
 with something like:

  import re

  def simple_grep(filename, pattern):
  find = re.compile(pattern).search
  for index, line in open(filename):
  if find(line):
  print filename, index, line[:-1]

 where pattern is an RE-style pattern, not a REGEX-style pattern (see the
 RE documentation for details).
 
 /F

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Reading a file using a UNC - help!

2006-09-26 Thread johnzenger
You should use os.path.exists to test if a file exists.  Your
exception-catching structure is not necessary.

Also, if the file you are reading from contains proper Windows
filenames, it is not necessary to replace \ with \\ and so forth.  The
\ acts as an escape character only when it is in Python source code,
not when it is in a string read from the real world.

Also, because you wisely use for x in inputfiles: it is not necessary
to search for and replace newlines.

[EMAIL PROTECTED] wrote:
 I have the simplest need...to read a file full of file names(unc) and
 then check to see if each of these files exists.  I tried with the
 following program, but always get file not found, even when it is
 there. If I type in the file name as a literal it works...

 Little program:

 #This module checks for file existence
 import string
 import sys

 def MainProcess():

 fileList = c:\a_list_of_filenames.txt
 inputFiles = open(fileList,r)

 cnt = 0
 cntNotFound = 0

 for x in inputFiles:
 cnt = cnt + 1
 try:
 x = x.replace(\\,)
 x = x.replace(\n,)
 open(x,rb)
 #open('myserver\\myshare\\myfile.dat',r)  #works when
 hard coded like this
 except IOError, (errno, strerror):
 print I/O error(%s): %s % (errno, strerror)
 cntNotFound = cntNotFound + 1
 print x +  Not Found
 except ValueError, (errno,strerror):
 print Some other error!  + str(errno) +   + strerror
 else:
 print Found  + x

 print str(cnt) +  total...
 print str(cntNotFound) +  not found...

 if __name__ == '__main__':
 MainProcess()

 Many thanks to anyone in advance to can tell me what I am doing wrong!
 Platform is XP with PythonWin.
 
 Richard Kessler
 [EMAIL PROTECTED]

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Newbie needs Help

2006-08-16 Thread johnzenger
Also, it may be easier to use string interpolation, as in:

return INSERT INTO statecode (state, name) VALUES ('%(state)s',
'%(name)s') % insert_dict

...after all necessary escaping, of course.

John Machin wrote:
 len wrote:
  Hi all
 
  I am writing a python program that inserts records into a database on
  XP using mxODBC.
 
  I need to write a section of code which will create the following SQL
  command as an example;
 
  INSERT INTO statecode (state, name) VALUES ('IL', 'Illinois')
 
  This statement will be built up using the following code;
 
  import mx.ODBC
  import mx.ODBC.Windows
  def insertFromDict(table, dict):
  Take dictionary object dict and produce sql for
  inserting it into the named table
  sql = 'INSERT INTO ' + table
  sql += ' ('
  sql += ', '.join(dict)
  sql += ') VALUES ('
  sql += ', '.join(map(dictValuePad, dict)) # ??? this code does
  NOT format correctly
  sql += ')'
  return sql
 
  def dictValuePad(key):# ??? this code
  does Not format correctly
  return ' + str(key) + '
 
  db = mx.ODBC.Windows.DriverConnect('dsn=UICPS Test')
  c = db.cursor()
  insert_dict = {'state':'IL', 'name':'Illinois'}
  sql = insertFromDict(statecode, insert_dict)
  print sql
  c.execute(sql)
 

 The code below will do what you say that you want to do -- so long as
 all your columns are strings (varchar or whatever in SQL terms).
 Otherwise IMHO you would be much better off doing it this way:
 sql = insert into policy (type, premium) values(?, ?)
 data = ('building', 123.45)
 cursor.execute(sql, data)
 for two reasons:
 (1) let the ODBC kit worry about formatting dates, strings with
 embedded single quotes, etc
 (2) it can be more efficient; the sql is constant and needs to be
 parsed only once
 (3) [bonus extra reason] the way you are doing it is vulnerable to
 what's called an SQL injection attack; although you have no doubt
 eyeballed all the data, doing it that way is a bad habit to get into.

 You should be able to modify the supplied code very easily to produce
 the sql variety with ? in it.

 HTH,
 John

 C:\junktype sqlinsdict.py
 def sqlquote(astring):
 return ' + astring.replace(', '') + '

 def insertFromDict(table, adict):
 Take dictionary object dict and produce sql for
 inserting it into the named table.
 Sample input:
 insert_dict = {'state':'IL', 'name':'Illinois'}
 sql = insertFromDict(statecode, insert_dict)
 Required output:
 INSERT INTO statecode (state, name) VALUES ('IL', 'Illinois')
 

 t = [
 'INSERT INTO ',
 table,
 ' (',
 ', '.join(adict.keys()),
 ') VALUES (',
 ', '.join(sqlquote(x) for x in adict.values()),
 ')',
 ]
 return ''.join(t)

 if __name__ == __main__:
 tests = [
 ('IL', 'Illinois'),
 ('OH', O'Hara),
 ]
 cols = ['state', 'name']
 for test in tests:
 the_dict = dict(zip(cols, test))
 print the_dict
 print insertFromDict('statecode', the_dict)

 C:\junksqlinsdict.py
 {'state': 'IL', 'name': 'Illinois'}
 INSERT INTO statecode (state, name) VALUES ('IL', 'Illinois')
 {'state': 'OH', 'name': O'Hara}
 INSERT INTO statecode (state, name) VALUES ('OH', 'O''Hara')

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Python framework questions

2006-07-05 Thread johnzenger
mp wrote:
 Hello, I have a couple general questions.

 First, how do most web frameworks serve html? I'm coding in python and
 I want to keep all my html seperate from my python stuff. I can serve
 these html files from a mysql database or just from the file system, do
 people use both these options? Are there other options?

The basic idea of templates is that you write something like:

h1{{ HEADLINE }}/h1
pby {{ AUTHOR }}/p
p{{ STORY }}/p

and the web framework fills in the blanks.  No need to store templates
in a SQL database; they are just files.


 Second, is a cgi-bin directory really necessary? Are there security
 issues with configuring Apache to allow cgi-bin execution in other
 directories?

Not only unnecessary but unadvisable.  It's very 1995, quite out of
fashion now. Read Tim Berners-Lee's article on Cool URIs.  URIs
should just describe content.  They are for the user's benefit, not
yours.  They are not a place to remind yourself where you stored code,
or what language you write in (hello, .php, .asp, .pl, and .py), or how
your web server gateways with your code.

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: string replace

2006-06-30 Thread johnzenger
Check out the .translate method and the string.maketrans documentation.
 You can use it to delete a list of characters all in one line:

 s = I am the walrus
 import string
 s.translate(string.maketrans(,),aeiou)
'I m th wlrs'



Michele Petrazzo wrote:
 Hi,
 a lot of times I need to replace more than one char into a string, so I
 have to do something like

 value = test
 chars = e
 for c in chars:
value = value.replace(c, )

 A solution could be that replace accept a tuple/list of chars, like
 that was add into the new 2.5 for startswith.

 I don't know, but can be this feature included into a future python release?
 
 Thanks,
 Michele

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: hard to explain for a french ;-)

2006-06-23 Thread johnzenger
How about an effort to compile Python into JavaScript?  Such an
effort is underway for Scheme.
http://www-sop.inria.fr/mimosa/personnel/Florian.Loitsch/scheme2js/

Tim Chase wrote:
  As explained in this thread
  http://mail.python.org/pipermail/python-list/2006-June/348241.html
   what you try to do will never work because your attempts are
  at using python on the client side and only javascript works
  for that purpose.

 Sounds like an opportunity to write JSPython...written in
 JavaScript, akin to CPython (written in C), Jython (written in
 Java), and PyPy (written in Python)...for those sick enough to
 undertake such a freakish task... :)
 
 sarcasm
 No...that wouldn't be slow...
 /sarcasm
 
 -tkc

-- 
http://mail.python.org/mailman/listinfo/python-list


Cross-site scripting (XSS) defense

2006-06-16 Thread johnzenger
Is there a module (or, better yet, sample code) that scrubs
user-entered text to remove cross-site scripting attacks, while also
allowing a small subset of HTML through?

Contemplated application: a message board that allows people to use
b, a href=, i and so on, but does not allow any javascript,
vbscript, or other nasties.

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: newb: comapring two strings

2006-05-18 Thread johnzenger

manstey wrote:
 Hi,

 Is there a clever way to see if two strings of the same length vary by
 only one character, and what the character is in both strings.

You want zip.

def diffbyonlyone(string1, string2):
diffcount = 0
for c1, c2 in zip(string1, string2):
if c1 != c2:
diffcount += 1
if diffcount  1:
return False
return diffcount == 1

print diffbyonlyone(yaqtil,yaqtel) # True
print diffbyonlyone(yiqtol,yaqtel) # False

If your strings are long, it might be faster/more memory efficient to
use itertools.izip instead.

 My next problem is, I have a list of 300,000+ words and I want to find
 every pair of such strings. I thought I would first sort on length of
 string, but how do I iterate through the following:

 str1
 str2
 str3
 str4
 str5

 so that I compare str1  str2, str1  str3, str 1  str4, str1  str5,
 str2  str3, str3  str4, str3  str5, str4  str5.

for index1 in xrange(len(words)):
for index2 in xrange(index1+1,len(words)):
if diffbyonlyone(words[index1], words[index2]):
print words[index1] +  --  + words[index2]

...but by all means run that only on sets of words that you have
already identified, pursuant to some criteria like word length, to be
likely matches.  Do the math; that's a lot of comparisons!

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: constucting a lookup table

2006-05-16 Thread johnzenger
How about a dictionary, keyed on tuples of (height, weight)?

[EMAIL PROTECTED] wrote:
 I'm new to Python and want to contruct a lookup table which would be
 similar to a spreadsheet in that a value is read along the first
 column, then along the top row, and the intersection of the two gives a
 value that is hard-coded, i.e. not mathmatically related.  An example
 would be a table with HEIGHT in the first column, WEIGHT in the first
 row, and estimated SUITSIZE with the body of the table.

 Which Python type would be most appropriate and/or efficient?
 
 thanks

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: regex help

2006-05-16 Thread johnzenger
Why not use split instead of regular expressions?

 ln = 3232 23  9 9 - 9 9 - 911 
 110
 ln.split()
['32', '32', '23', '9', '9', '-', '9', '9', '-', '9', '11', '1', '10']

Much simpler, yes?  Just find the line that comes after a line that
begins with TIGER, split it, and pick the number you want out of the
resulting list.

Lance Hoffmeyer wrote:
 I have the following table and I am trying to match percentage the 2nd column 
 on the 2nd Tiger line (9.0).

 I have tried both of the following.  I expected both to match but neither 
 did?  Is there a modifier
 I am missing?  What changes do I need to make these match?  I need to keep 
 the structure of the regex
 the same.

 TIGER.append(re.search(TIGER\s{10}.*?(?:(\d{1,3}\.\d)\s+){2}, 
 target_table).group(1))
 TIGER.append(re.search(^TIGER.*?(?:(\d{1,3}\.\d)\s+){2}, 
 target_table).group(1))


 BASE - TOTAL TIGER 268   268173 95   101 -   10157 -  
   5778 276   268   19276230 21

 DOG 7979 44 3531 -3117 -  
   1725 124795524 75  1
   29.5  29.5   25.4   36.8  30.7 -  30.7  29.8 -  
 29.8  32.1  50.0  31.6  29.5  28.6  31.6   32.64.8

 CAT 4646 28 1820 -20 7 -  
714 -14463214 39  4
   17.2  17.2   16.2   18.9  19.8 -  19.8  12.3 -  
 12.3  17.9 -  18.4  17.2  16.7  18.4   17.0   19.0

 LAMB3232 23  910 -10 8 -  
812 -12322012 28  1
   11.9  11.9   13.39.5   9.9 -   9.9  14.0 -  
 14.0  15.4 -  15.8  11.9  10.4  15.8   12.24.8

 TRIPOD  3232 23  9 9 - 9 9 -  
911 110322210 28  3
   11.9  11.9   13.39.5   8.9 -   8.9  15.8 -  
 15.8  14.1  50.0  13.2  11.9  11.5  13.2   12.2   14.3

 TIGER   2424 16  8 5 - 510 -  
   10 7 - 72417 7 18  2
9.0   9.09.28.4   5.0 -   5.0  17.5 -  
 17.5   9.0 -   9.2   9.0   8.9   9.27.89.5

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Help System For Python Applications

2006-05-16 Thread johnzenger

[EMAIL PROTECTED] wrote:
 On a related note, is there a way to fire up Adobe's Acorbat Reader or
 and Web Browser from Python and have the external application open a
 specified PDF or HTML file? (For example, I want to open the file
 myhelp.pdf in reader from Python code.)

The webbrowser module lets you open any page.  HTML will open in the
user's default web browser; PDF opens in Acrobat (at least on my
Windows machine).

 import webbrowser
 webbrowser.open(rC:\\helpfile.pdf)

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Gettings subdirectories

2006-05-03 Thread johnzenger
It's a bit overkill, but consider using os.walk.

root, dirnames, filenames = os.walk(rC:\).next()  # (in real code,
you'd want to catch exceptions here)
print dirnames

Florian Lindner wrote:
 Hello,
 how can I get all subdirectories of a given directories? os.listdir() gives
 me all entries and I've found no way to tell if an object is a file or a
 directory.
 
 Thanks,
 
 Florian

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Possibly dumb question about dicts and __hash__()

2006-05-03 Thread johnzenger
Use __repr__.  Behold:

 class NamedThing(object):
 def __init__(self, name):
 self.name = name
 def __repr__(self):
 return self.name

 a = NamedThing(Delaware)
 b = NamedThing(Hawaii)
 d = {}
 d[a] = 1
 d[b] = 50
 print d
{Delaware: 1, Hawaii: 50}
 d[a]
1
 d[b]
50

Although this is a bit illegal, because repr is not supposed to be used
this way.

Joel Hedlund wrote:
 Hi!

 There's one thing about dictionaries and __hash__() methods that puzzle me. I
 have a class with several data members, one of which is 'name' (a str). I 
 would
 like to store several of these objects in a dict for quick access
 ({name:object} style). Now, I was thinking that given a list of objects I 
 might
 do something like

 d = {}
 for o in objects:
  d[o] = o

 and still be able to retrieve the data like so:

 d[name]

 if I just defined a __hash__ method like so:

 def __hash__(self):
  return self.name.__hash__()

 but this fails miserably. Feel free to laugh if you feel like it. I cooked up 
 a
 little example with sample output below if you care to take the time.

 Code:
 ---
 class NamedThing(object):
  def __init__(self, name):
  self.name = name
  def __hash__(self):
  return self.name.__hash__()
  def __repr__(self):
  return 'foo'
 name = 'moo'
 o = NamedThing(name)
 print This output puzzles me:
 d = {}
 d[o] = o
 d[name] = o
 print d
 print
 print If I wrap all keys in hash() calls I'm fine:
 d = {}
 d[hash(o)] = o
 d[hash(name)] = o
 print d
 print
 print But how come the first method didn't work?
 ---

 Output:
 ---
 This output puzzles me:
 {'moo': foo, foo: foo}

 If I wrap all keys in hash() calls I'm fine:
 {2038943316: foo}

 But how come the first method didn't work?
 ---

 I'd be grateful if anyone can shed a litte light on this, or point me to some
 docs I might have missed.

 Also:
 Am I in fact abusing the __hash__() method? If so - what's the intended use of
 the __hash__() method?

 Is there a better way of implementing this?

 I realise I could just write

 d[o.name] = o

 but this problem seems to pop up every now and then and I'm curious if there's
 some neat syntactic trick that I could legally apply here.
 
 Thanks for your time!
 /Joel Hedlund

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Possibly dumb question about dicts and __hash__()

2006-05-03 Thread johnzenger
Actually, come to think of it, __str__ works just as well.

 class NamedThing(object):
 def __init__(self, name):
 self.name = name
 def __str__(self):
 return self.name
 d = {}
 d[a] = 1
 d[b] = 50
 d
{__main__.NamedThing object at 0x00C528D0: 1, __main__.NamedThing
object at 0x00C529B0: 50}
 d[a]
1
 d[b]
50

This is what you should use, instead of my first answer.  From the docs
for __repr__: If at all possible, this should look like a valid Python
expression that could be used to recreate an object with the same value
(given an appropriate environment). If this is not possible, a string
of the form ...some useful description... should be returned. ...
This is typically used for debugging, so it is important that the
representation is information-rich and unambiguous.



[EMAIL PROTECTED] wrote:
 Use __repr__.  Behold:

  class NamedThing(object):
  def __init__(self, name):
  self.name = name
  def __repr__(self):
  return self.name

  a = NamedThing(Delaware)
  b = NamedThing(Hawaii)
  d = {}
  d[a] = 1
  d[b] = 50
  print d
 {Delaware: 1, Hawaii: 50}
  d[a]
 1
  d[b]
 50

 Although this is a bit illegal, because repr is not supposed to be used
 this way.

 Joel Hedlund wrote:
  Hi!
 
  There's one thing about dictionaries and __hash__() methods that puzzle me. 
  I
  have a class with several data members, one of which is 'name' (a str). I 
  would
  like to store several of these objects in a dict for quick access
  ({name:object} style). Now, I was thinking that given a list of objects I 
  might
  do something like
 
  d = {}
  for o in objects:
   d[o] = o
 
  and still be able to retrieve the data like so:
 
  d[name]
 
  if I just defined a __hash__ method like so:
 
  def __hash__(self):
   return self.name.__hash__()
 
  but this fails miserably. Feel free to laugh if you feel like it. I cooked 
  up a
  little example with sample output below if you care to take the time.
 
  Code:
  ---
  class NamedThing(object):
   def __init__(self, name):
   self.name = name
   def __hash__(self):
   return self.name.__hash__()
   def __repr__(self):
   return 'foo'
  name = 'moo'
  o = NamedThing(name)
  print This output puzzles me:
  d = {}
  d[o] = o
  d[name] = o
  print d
  print
  print If I wrap all keys in hash() calls I'm fine:
  d = {}
  d[hash(o)] = o
  d[hash(name)] = o
  print d
  print
  print But how come the first method didn't work?
  ---
 
  Output:
  ---
  This output puzzles me:
  {'moo': foo, foo: foo}
 
  If I wrap all keys in hash() calls I'm fine:
  {2038943316: foo}
 
  But how come the first method didn't work?
  ---
 
  I'd be grateful if anyone can shed a litte light on this, or point me to 
  some
  docs I might have missed.
 
  Also:
  Am I in fact abusing the __hash__() method? If so - what's the intended use 
  of
  the __hash__() method?
 
  Is there a better way of implementing this?
 
  I realise I could just write
 
  d[o.name] = o
 
  but this problem seems to pop up every now and then and I'm curious if 
  there's
  some neat syntactic trick that I could legally apply here.
  
  Thanks for your time!
  /Joel Hedlund

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Regular Expression help

2006-04-27 Thread johnzenger
If you are parsing HTML, it may make more sense to use a package
designed especially for that purpose, like Beautiful Soup.

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Regular Expression help

2006-04-27 Thread johnzenger
If what you need is simple, regular expressions are almost never the
answer.  And how simple can it be if you are posting here?  :)

BeautifulSoup isn't all that hard.  Observe:

 from BeautifulSoup import BeautifulSoup
 html = '10:00am - 11:00am:/b a 
 href=/tvpdb?d=tvpid=167540528[snip]The Price Is Right/aem'
 soup = BeautifulSoup(html)
 soup('a')
[a href=/tvpdb?d=tvpid=167540528ThePrice Is Right/a]
 for show in soup('a'):
print show.contents[0]


The Price Is Right



RunLevelZero wrote:
 I considered that but what I need is simple and I don't want to use
 another library for something so simple but thank you.  Plus I don't
 understand them all that well :)

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: scanning for numerals / letters

2006-04-19 Thread johnzenger
First, note that form[date] is all you need.  form[date].value is
redundant.

I would do this with sets:

import string
if set(form[date])  set(string.ascii_letters) != set([]): print You
have to enter a date with numbers

if set(form[purchases])  set(string.digits) != set([]): print
Please do not use numbers

Sets take time to construct, but they test membership faster than
strings.  Plus, the code just reads logically.  (The , if you couldn't
figure it out, does an intersection of sets.  You could also use the
.intersection method for even better readability).

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: local greediness ???

2006-04-19 Thread johnzenger
How about using the numbers as delimiters:

 pat = re.compile(r[\d\.\-]+)
 pat.split([(some text)2.3(more text)4.5(more text here)])
['[(some text)', '(more text)', '(more text here)]']
 pat.findall([(some text)2.3(more text)4.5(more text here)])
['2.3', '4.5']
 pat.split([(xxx)11.0(bbb\))8.9(end here)] )
['[(xxx)', '(bbb\\))', '(end here)] ']
 pat.findall([(xxx)11.0(bbb\))8.9(end here)] )
['11.0', '8.9']

[EMAIL PROTECTED] wrote:
 hi, all. I need to process a file with the following format:
 $ cat sample
 [(some text)2.3(more text)4.5(more text here)]
 [(aa bb ccc)-1.2(kdk)12.0(xxxyyy)]
 [(xxx)11.0(bbb\))8.9(end here)]
 ...

 my goal here is for each line, extract every '(.*)' (including the
 round
 brackets, put them in a list, and extract every float on the same line
 and put them in a list.. here is my code:

   p = re.compile(r'\[.*\]$')
   num = re.compile(r'[-\d]+[.\d]*')
   brac  = re.compile(r'\(.*?\)')

   for line in ifp:
   if p.match(line):
   x = num.findall(line)
   y = brac.findall(line)
 print x, y len(x), len(y)

 Now, this works for most of the lines. however, I'm having problems
 with
 lines such as line 3 above (in the sample file). here, (bbb\)) contains
 an escaped
 ')' and the re I use will match it (because of the non-greedy '?'). But
 I want this to
 be ignored since it's escaped. is there a such thing as local
 greediness??
 Can anyone suggest a way to deal with this here.. 
 thanks.

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: regular expressions and matches

2006-03-30 Thread johnzenger

Johhny wrote:
 Hello,

 I have recently written a small function that will verify that an IP
 address is valid.

 ==SNIP==

 import re
 ipAddress = raw_input('IP Address : ')

 def validateIP(ipAddress):
 ipRegex =
 r^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])$

Good lord!  You might as well be writing in assembly!  The re module
docs should include a customer warning label.

Regular expressions are not the answer here.  Probably 80% of the regex
virus could be stamped out if people used split instead.  How about
something simpler, like this:

def ipValid(ipAddress):
dots = ipAddress.split(.)
if len(dots) != 4:
return False
for item in dots:
if not 0 = int(item) = 255:
return False
return True

...although even this function (like yours) will declare as valid an
IP address like 0.255.0.0.

For a real-world application, how about:

import socket
try:
mm = socket.inet_aton(ipAddress)
return True # We got through that call without an error, so it is
valid
except socket.error:
return False # There was an error, so it is invalid


 re_ip = re.compile(ipRegex)
 match = re_ip.match(ipAddress)
 if not match:
 print an error has occured with ipAddress
 return match
 else:
 return match

 print(validateIP(ipAddress))

 ==SNIP==

 I was having issues trying to get my code working so that I could pass
 the IP addresses and it would return a true or false. When it matches I
 get something that looks like this.

 python ip_valid.py
 IP Address : 192.158.1.1
 _sre.SRE_Match object at 0xb7de8c80

 As I am still attempting to learn python I am interested to know how I
 could get the above to return a true or false if it matches or does not
 match the IP address. I would also like to expand that so that if the
 IP is wrong it requests the IP address again and recalls the function.
 I have done the same thing in php very easily but python appears to be
 getting the better of me. Any assistance and advice would be greatly
 appreciated.
 
 Regards,
 
 Johhny

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: recursive map on nested list

2006-03-21 Thread johnzenger
Uglier than yours, but down to two lines:

def recur_map(f, data):
return [ not hasattr(x, __iter__) and f(x) or recur_map(f, x) for x
in data ]

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: trying to find repeated substrings with regular expression

2006-03-13 Thread johnzenger
Robert Dodier wrote:

 I've decided it's easier for me just to search for FOO, and then
 break up the string based on the locations of FOO.

 But I'd like to better understand regular expressions.

Those who cannot learn regular expressions are doomed to repeat string
searches.  Which is not such a bad thing.

txt = blah FOO blah1a blah1b FOO blah2 FOO blah3a blah3b blah3b

def fa(s, pat):
retlist = []
try:
while True:
i = s.rindex(pat)
retlist.insert(0,s[i:])
s = s[:i]
except:
return retlist

print fa(txt, FOO)

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: time series calculation in list comprehension?

2006-03-10 Thread johnzenger
falcon wrote:
 Is there a way I can do time series calculation, such as a moving
 average in list comprehension syntax?  I'm new to python but it looks
 like list comprehension's 'head' can only work at a value at a time.  I
 also tried using the reduce function and passed in my list and another
 function which calculates a moving average outside the list comp. ...
 but I'm not clear how to do it.  Any ideas?  Thanks.

I agree with others that reduce is not the best way to do this.  But,
to satisfy your curiosity, I offer this horribly inefficient way to use
reduce to calculate the average of a list:

from __future__ import division

def reduceaverage(acc, x):
return [acc[0] + x, acc[1] + 1, (acc[0] + x) / (acc[1] + 1) ]

numbers = [4, 8, 15, 16, 23, 42]
print reduce(reduceaverage, numbers, [0,0,0])[2]

...basically, the idea is to write a function that takes as its first
argument the accumulated values, and as its second argument the next
value in the list.  In Python, this is almost always the wrong way to
do something, but it is kind of geeky and LISP-ish.

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Help - just a few lines of code needed

2006-03-06 Thread johnzenger
There is some fine permutation code in the cookbook.  Take a look at
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/190465 .

You can easily code something like:

# xcombinations from the cookbook
def xcombinations(items, n):
if n==0: yield []
else:
for i in xrange(len(items)):
for cc in xcombinations(items[:i]+items[i+1:],n-1):
yield [items[i]]+cc

wordlist = ['HOUSE','jolly','---','0','99']

for i in xrange(1, len(wordlist)+1):
for g in xcombinations(wordlist, i):
print .join(g)


 Unfortunately I am not able to program it myself, so
 I would appreciate if someone could write this piece of
 software, compile it (for DOS or Windows) and send the .exe file to:

 lory88 at gmail . com

Meet us halfway, here.  At least install Python.

Also, it's a dangerous world out there.  Don't run .exe s sent to you
by people you don't know.

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Searching for uniqness in a list of data

2006-03-01 Thread johnzenger
You can come quite close to what you want without splitting the string
at all.  It sounds like you are asking the user to build up a string,
and you want to keep checking through your list to find any items that
begin with the string built up by the user.  Try something like this:

mylist = ['1p2m_3.3-1.8v_sal_ms','1p2m_3.3-1.8_sal_log']
sofar = 

loop = True
while loop:
selections = [ x[len(sofar):x.index(_, len(sofar) + 1)]
   for x in mylist if x.startswith(sofar) ]
loop = len(selections)  1
if loop:
print selections
sofar += raw_input(Pick one of those: )

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: comple list slices

2006-02-28 Thread johnzenger
Python lets you iterate through a list using an integer index, too,
although if you do so we will make fun of you.  You can accomplish it
with a while loop, as in:

i = 0
while i  len(rows):
   if rows[i] == This code looks like BASIC without the WEND, doesn't
it?:
  rowgroups.append(Pretty much.)
   i += 1 # or i += rowspan, whatever.

Do not try to do this with a for loop.  In Python, for i in xrange(5)
is more like a foreach $i ( {0,1,2,3,4,5}) in Perl, so changing i in
the loop will not change the value of i on the next loop iteration.

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Vectorization and Numeric (Newbie)

2006-02-28 Thread johnzenger
map takes a function and a list, applies the function to each item in
a list, and returns the result list.  For example:

 def f(x): return x + 4

 numbers = [4, 8, 15, 16, 23, 42]
 map(f, numbers)
[8, 12, 19, 20, 27, 46]

So, rather that ask if there is a different way to write f, I'd just
use f in a different way.

Another way to accomplish the same result is with a list comprehension:

 [f(x) for x in numbers]
[8, 12, 19, 20, 27, 46]

As you can see, if you wanted to calculate all the values from 1 to
n, you could also use these techniques instead of a loop.

 n = 10
 [f(x) for x in xrange(1, n+1)]
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: comple list slices

2006-02-28 Thread johnzenger
Although I don't know if this is faster or more efficient than your
current solution, it does look cooler:

def grouprows(inrows):
rows = []
rows[:] = inrows  #  makes a copy because we're going to be
deleting
while len(rows)  0:
rowspan = rows[0][rowspan]
yield rows[0:rowspan]  # returns this value, but control flow
unaffected
del rows[0:rowspan]  # remove what we just returned from the
list, and loop

grouper = grouprows(copyrows)
print [x for x in grouper]

This is basically just a simple function that rips chunks off the front
of a list and returns them.  Because the function uses yield rather
than return, it becomes a generator, which can be treated by Python
as an iterator.

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: comple list slices

2006-02-28 Thread johnzenger
You don't need to copy the list; but if you don't, your original list
will be emptied.

Len(rows) recalculates each time the while loop begins.  Now that I
think of it, rows != [] is faster than len(rows)  0.

By the way, you can also do this using (gasp) a control index:

def grouprows(rows):
index = 0
while len(rows)  index:
rowspan = rows[index][rowspan]
yield rows[index:rowspan + index]
index += rowspan

...which kind of brings us back to where we started.

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Rounding up to the nearest exact logarithmic decade

2006-02-28 Thread johnzenger
I like Fredrik's solution.  If for some reason you are afraid of
logarithms, you could also do:

 x = 4978
 decades = [10 ** n for n in xrange(-1,8)]
 import itertools
 itertools.ifilter(lambda decade: x  decade, decades).next()
1

BTW, are the python-dev guys aware that 10 ** -1 = 0.10001 ?

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: how do I factor a number down to one digit?

2006-02-27 Thread johnzenger
Your tools are:

1.  map lets you apply a function to every element of a list.
Strings are lists.  (List comprehensions let you do the same thing, but
map is better to use if you are turning in homework).
2.  sum lets you calculate the sum of all numbers in a list.
3.  val and str let you turn strings into numbers and numbers into
strings

The only missing piece is a function that turns a letter into a number.
 It shouldn't be that hard to write one.

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Regular expression fun. Repeated matching of a group Q

2006-02-24 Thread johnzenger
There's more to re than just sub.  How about:

sanesplit = re.split(r/tdtd|td|/td, text)
date = sanesplit[1]
times = times = [time for time in sanesplit if re.match(\d\d:\d\d,
time)]

... then date contains the date at the beginning of the line and
times contains all your times.

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Regular expression fun. Repeated matching of a group Q

2006-02-24 Thread johnzenger
You can check len(sanesplit) to see how big your list is.  If it is 
2, then there were no  td's, so move on to the next line.

It is probably possible to do the whole thing with a regular
expression.  It is probably not wise to do so.  Regular expressions are
difficult to read, and, as you discovered, difficult to program and
debug.  In many cases, Python code that relies on regular expressions
for lots of program logic runs slower than code that uses normal
Python.

Suppose words contains all the words in English.  Compare these two
lines:

foobarwords1 = [x for x in words if re.search(foo|bar, x) ]
foobarwords2 = [x for x in words if foo in x or bar in x ]

I haven't tested this with 2.4, but as of a few years ago it was a safe
bet that foobarwords2 will be calculated much, much faster.  Also, I
think you will agree, foobarwords2 is a lot easier to read.

-- 
http://mail.python.org/mailman/listinfo/python-list