Re: Programming Idiomatic Code
On Jul 2, 5:22 pm, Nathan Harmston [EMAIL PROTECTED] wrote: Hi, I m sorry but I m bored at work (and no ones looking so I can write some Python) and following a job advertisement post,I decided to write the code to do its for the one entitled Ninjas or something like that. I was wondering what could be done to my following code to make it more idiomatic...or whether it was idiomatic and to be honest what idiomatic really means. All comments greatly appreciated and welcomed. Thanks in advance Nathan import urllib2,sys from elementtree.ElementTree import parse base_url = http://api.etsy.com/feeds/xml_user_details.php?id=; def read_id_file(filename): reads a file and generates a list of ids from it ids = [ ] try: id_file = open(filename, r) for l in id_file: ids.append( l.strip(\n) ) id_file.close() except e: print e os._exit(99) return ids The expression in the except clause should evaluate to an object that matches the exception. For example, import sys try: idfile = open(filename, r) except IOError, e print sys.stderr, str(e) # or look into the warnings module # etc. -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: log caller
On Jun 27, 2:42 pm, Matthew Peter [EMAIL PROTECTED] wrote: Is it possible to print the function calls to a module? Like: test.py import mymod print mymod.x() mymod.py # each time a function is called we print out the called function and module print 'Func call: %s from %s' % (???, ???) def x(): return 'hello' Where would I pick up the ??? variables? A brief example would be nice too :) Thanks in advance! You can use a decorator to wrap the function. You can use sys._getframe or inspect.stack to get information about the caller. The examples from the decorator module are very useful: http://www.phyast.pitt.edu/~micheles/python/documentation.html If for some reason you can't edit mymod.py to add the decorators, you can still wrap the function: import mymod import inspect try: from functools import update_wrapper except ImportError: def decorator_trace(f): def newf(): caller = inspect.stack()[1] print 'Caller is line %d of %s' % (caller[2], caller[1]) print 'Calling: %s from %s' % (f.__name__, f.__module__) return f() newf.__name__ = f.__name__ newf.__dict__.update(f.__dict__) newf.__doc__ = f.__doc__ newf.__module__ = f.__module__ return newf else: def decorator_trace(f): def newf(): caller = inspect.stack()[1] print 'Caller is line %d of %s' % (caller[2], caller[1]) print 'Calling: %s from %s' % (f.__name__, f.__module__) return f() return update_wrapper(newf, f) mymod.x = decorator_trace(mymod.x) greetings = mymod.x() print greetings but this approach has the shortcoming mentioned in the article. -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Help needed with translating perl to python
On Jun 26, 8:04 am, vj [EMAIL PROTECTED] wrote: I have a perl script which connect to network stream using sockets. The scripts first logins in to the server and then parses the data comming from the socket. Statement 1: my $today = sprintf(%4s%02s%02s, [localtime()]-[5]+1900, [localtime()]-[4]+1, [localtime()]-[3]) ; Perl has Do What I Mean features that allow you to treat strings and number interchangeably. Python's time.localtime returns a tuple of integers so you'll have to use the proper format conversion characters: import time today = %04d%02d%02d % time.localtime()[0:3] # No need to add offsets of 1900 and 1 because Python # does this for you Statement 2: my $password = md5_hex($today$username) ; You should have added that md5_hex is comes from Digest::MD5, not a core Perl module. Regardless: import md5 password = md5.new(%s%s % (today, username)).hexdigest() # seems to be what you wanted Statement group 3: $msglen = bcdlen(length($msg)) ; sub bcdlen { my $strlen = sprintf(%04s, shift) ; my $firstval = substr($strlen, 2, 1)*16 + substr($strlen, 3, 1) ; my $lastval = substr($strlen, 0, 1)*16 + substr($strlen, 1, 1) ; return chr($firstval) . chr($lastval) ; } You can have a variadic function in Python but the parameters are passed via a tuple. Because a tuple is immutable, one cannot shift elements out of a tuple. Here I've used the first parameter via selection by index. Perl's substr is replaced by slice notation; chr is, well, chr. Concatenation (Perl's '.' operator) is replaced by string formatting: def bcdlen(*args): ... strlen = %04s % str(args[0]) ... firstval = int(strlen[2:3]) * 16 + int(strlen[3:4]) ... lastval = int(strlen[0:1]) * 16 + int(strlen[1:2]) ... return %s%s % (chr(firstval), chr(lastval)) ... bcdlen(4546) 'FE' -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Help needed with translating perl to python
On Jun 26, 8:59 am, [EMAIL PROTECTED] wrote: (snipped) def bcdlen(*args): ... strlen = %04s % str(args[0]) ... firstval = int(strlen[2:3]) * 16 + int(strlen[3:4]) ... lastval = int(strlen[0:1]) * 16 + int(strlen[1:2]) ... return %s%s % (chr(firstval), chr(lastval)) ... bcdlen(4546) 'FE' Let me add that instead of an an-close-as-possible translation from the original Perl code, one can rewrite this as: def bcdlen(length): ... strlen = %04s % length ... return chr(int(strlen[2:4], 16)) + chr(int(strlen[0:2], 16)) which is more Pythonic to me. -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: regular expressions eliminating filenames of type foo.thumbnail.jpg
On Jun 25, 2:41 pm, oscartheduck [EMAIL PROTECTED] wrote: I eventually went with: #!/usr/bin/env python from PIL import Image import glob, os, re size = 128, 128 def thumbnailer(dir, filenameRx): for picture in [ p for p in os.listdir(dir) if os.path.isfile(os.path.join( dir,p)) and filenameRx.match(p) if 'thumbnail' not in p]: file, ext = os.path.splitext(picture) (snipped) Or, one can forego regular expressions: prefix = '.thumbnail' for p in os.listdir(dir): root, ext = os.path.splitext(p) if not os.path.isfile(os.path.join(dir, p)) \ or ext.lower() not in ('.jpg', '.jpeg') \ or root[-10:].lower() == prefix: continue if os.path.isfile(os.path.join(dir, %s%s%s % (root, prefix, ext))): print A thumbnail of %s already exists % p else: print Making a thumbnail of %s % os.path.join(dir, %s%s%s % (root, prefix, ext)) -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Adding method to a class on the fly
On Jun 22, 2:44 pm, John Henry [EMAIL PROTECTED] wrote: On Jun 22, 2:28 pm, askel [EMAIL PROTECTED] wrote: (snipped) The above doesn't exactly do I what need. I was looking for a way to add method to a class at run time. I'm not sure what you mean by this. Bind an attribute -- a method -- to class Dummy if and only if an instance of this class is created? What does work, is to define an entire sub-class at run time. Like: class DummyParent: def __init__(self): return def method_static(self, text): print text return text = class Dummy(DummyParent): text += \n\t + def __init(self): text += \n\t + \tDummyParent.__init__(self) text += \n\t + def method_dynamic(self): text += \n\t + \tself.method_static(\it's me\) exec text dum=Dummy().method_dynamic() Thanks again. I tend to avoid exec if possible. Also, you seem to be a bit inexact with regard to the term static. class Dummy(object): def __init__(self): new_method_name = 'method_dynamic' try: getattr(Dummy, new_method_name) except AttributeError: print Creating an instance method... def newf(self): Something Descriptive Here return self.method_static(it's me) newf.__name__ = new_method_name setattr(Dummy, new_method_name, newf) def method_static(self, text): I hate this name. Do not confuse this with a staticmethod; what you probably meant was that this is an attribute (a method) bound within the class body as opposed to elsewhere print text return # is this necessary? d1 = Dummy() d1.method_dynamic() d2 = Dummy() d2.method_dynamic() print d1.method_dynamic.im_func.__name__ print d1.method_dynamic.im_func.__dict__ print d1.method_dynamic.im_func.__doc__ print d1.method_dynamic.im_func.__module__ print d1.method_dynamic.im_self -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: newb: Scope Question
On Jun 22, 3:53 pm, johnny [EMAIL PROTECTED] wrote: Scope of ids: When I print ids, it's always empty string '', as I have intialized before. That's not what I want. I want the ids to have str(r['id']).join(',') if res: ids = '' for r in res['key']: ids = str(r['id']).join(',') print(ids: %s %(ids)) 1. You haven't posted enough code to allow someone else to reproduce the problem. 2. Are you sure that res['key'] isn't an empty sequence? 3. The 'join' operation looks funny. The syntax is separator.join(sequence). Since ',' is a sequence of length one, you'll get, if anything, a comma (',') as the value of ids. res = { 'key': [dict(id=value) for value in range(10)] } if res: ids = '' for r in res['key']: ids = str(r['id']).join(',') print (ids : %s % (ids)) # Wild guess -- perhaps you really wanted: if res: ids = ','.join(str(r['id']) for r in res['key']) print ids : %s % ids -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Help With Better Design
On Jun 19, 6:34 pm, [EMAIL PROTECTED] wrote: Greetings, I have been working on a little project today to help me better understand classes in Python (I really like Python). I am a self taught programmer and consider myself to fall in the beginner category for sure. It was initially sparked by reading about state machines. This was my attempt at it however I feel it is not quite where it should be: ON = ON OFF = OFF class LightBulb: def __init__(self, initial_state): self.state = initial_state def TurnOn(self): if self.state == OFF: self.state = ON else: print The Bulb Is Already ON! def TurnOff(self): if self.state == ON: self.state = OFF else: print The Bulb Is Aleady OFF! if __name__== __main__: light = LightBulb(OFF) simulation_running = True while simulation_running: print The light is, light.state print print Please choose an action: print print [1] Turn Light On print [2] Turn Light Off print [3] Exit Simulation print u_choice = raw_input(Please Enter Your Choice: ) if u_choice == '1': light.TurnOn() if u_choice == '2': light.TurnOff() elif u_choice == '3': break else: continue The test portion of the code is actually longer than the class itself :-) I would like to be able to get a good hold of the concept with this example before I try to model a more complex problem. Would someone be willing to give me some feedback on this class and whether I am on the right track or how I might better go about it? If all you're implementing is on-or-off logic, then I'd use the boolean values in Python (True and False), rather than defining my own 'ON' and 'OFF'. Here I use __str__ for printing and a _toggle function to cut down on the possibility of coding errors: class LightBulb: def __init__(self, bool): self.on = bool def __str__(self): return self.on and On or Off def _toggle(self): self.on = not self.on def TurnOn(self): if self.on: print \tThe Bulb is ready %s % self else: self._toggle() def TurnOff(self): if not self.on: print \tThe Bulb is ready %s % self else: self._toggle() if __name__ == __main__: light = LightBulb(False) while True: print The light is %s Please choose an action: [1] Turn Light On [2] Turn Light Off [3] Exit % light u_choice = raw_input(Please Enter Your Choice: ) if u_choice == '1': light.TurnOn() elif u_choice == '2': light.TurnOff() elif u_choice == '3': break else: continue If you're really coding a state machine wherein many states are possible and many choices are availble to the user, then I'd refactor. Rather than having a long sequence of if ... elif ... elif ... else, perhaps I'd use something like: import sys class LightBulb: def __init__(self, bool): self.on = bool def process_instruction(self, wanted): Pass self to unbound method try: LightBulb.instructions[wanted][1](self) except IndexError: pass def __str__(self): return self.on and On or Off def _toggle(self): self.on = not self.on def TurnOn(self): if self.on: print \n\t** The Bulb is already %s ** % self else: self._toggle() def TurnOff(self): if not self.on: print \n\t** The Bulb is already %s ** % self else: self._toggle() instructions = ( \ (Exit, sys.exit), (Turn Light On, TurnOn), (Turn Light Off, TurnOff),) if __name__ == __main__: light=LightBulb(False) usage=[\t%d: %s % (i,t[0]) for i,t in enumerate(LightBulb.instructions)] usage.insert(0, \n\tThe light is %s\n\tPlease choose an action:) prompt = \n.join(usage) while True: print prompt % light u_choice = raw_input(\nPlease Enter Your Choice: ) try: light.process_instruction(int(u_choice)) except ValueError: pass Note that I can add intructions as needed to LightBulb.instructions and not have to change the user interface. -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: example: 40286 - 68204
On Jun 3, 5:23 pm, Shihpin [EMAIL PROTECTED] wrote: Hi all, Is there a fuction that reverse the digits of a number? Many thanks, Shihpin Lin One can use int, str and a slice: print int(str(40286)[::-1]) -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Usage of the __and__ method
On May 30, 10:11 pm, theju [EMAIL PROTECTED] wrote: Hello all, I've two objects (both instances of a class called Person) and I want to use the __and__ method and print the combined attributes of the two instances. To be precise, here is my code class Person: def __init__(self,name): self.name = name def print_name(self): print self.name def __and__(self,other): self.name = '%s AND %s' %(self.name,other.name) return self.name p = Person(John) q = Person(George) r = p and q print r.print_name() Try: class Person(object): def __init__(self, name): self.name = name def __and__(self, other): return '%s AND %s' % (self.name, other.name) p = Person(John) q = Person(George) r = p q print r (1) A getter method (like your print_name method) is usually not needed, just access the attribute of the instance. Like, print p.name (2) I doubt that you want the __and__ special method to alter the name attribute of an instance. (3) You want to use the '' operator to dispatch to the __and__ method; __and__ is typically used for Numeric objects. (4) You misunderstood how the 'and' operator is used. The expression 'p and q' causes p to be evaluated; if p is false, its value is returned; otherwise q is evaluated and its value is returned. -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: converting text and spans to an ElementTree
On May 21, 11:02 pm, Steven Bethard [EMAIL PROTECTED] wrote: I have some text and a list of Element objects and their offsets, e.g.:: text = 'aaa aaa aaabbb bbbaaa' spans = [ ... (etree.Element('a'), 0, 21), ... (etree.Element('b'), 11, 18), ... (etree.Element('c'), 18, 18), ... ] I'd like to produce the corresponding ElementTree. So I want to write a get_tree() function that works like:: tree = get_tree(text, spans) etree.tostring(tree) ' aaa aaa bbbc //baaa/a' Perhaps I just need some more sleep, but I can't see an obvious way to do this. Any suggestions? It seems you're looking to construct an Interval Tree: http://en.wikipedia.org/wiki/Interval_tree -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: converting text and spans to an ElementTree
On May 21, 11:02 pm, Steven Bethard [EMAIL PROTECTED] wrote: I have some text and a list of Element objects and their offsets, e.g.:: text = 'aaa aaa aaabbb bbbaaa' spans = [ ... (etree.Element('a'), 0, 21), ... (etree.Element('b'), 11, 18), ... (etree.Element('c'), 18, 18), ... ] I'd like to produce the corresponding ElementTree. So I want to write a get_tree() function that works like:: tree = get_tree(text, spans) etree.tostring(tree) ' aaa aaa bbbc //baaa/a' Perhaps I just need some more sleep, but I can't see an obvious way to do this. Any suggestions? It seems you're looking to construct an Interval Tree: http://en.wikipedia.org/wiki/Interval_tree -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: matplotlib: howto set title of whole window?
On May 11, 3:44 pm, dmitrey [EMAIL PROTECTED] wrote: hi all, does anyone know howto set title of whole window? (I mean not just area above plot but string in the same line where buttons 'close', 'iconify', 'fullscreen' are situated) Use coordinates to set a title for the current figure. E.g., from pylab import * from matplotlib.font_manager import FontProperties figtitle = 'This is my title above all subplots' t = gcf().text(0.5, 0.95, figtitle, horizontalalignment='center', fontproperties=FontProperties(size=16)) subplot(121) subplot(122) show() -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Inheritance problem
On May 9, 11:33 am, Bjoern Schliessmann usenet- [EMAIL PROTECTED] wrote: [EMAIL PROTECTED] wrote: class longList(shortList): def __init__(self): shortList.setList() self.setList() Addition: Always call the base class __init__ in your constructor if there exists one, i. e. class longList(shortList) def __init__(self): shortlist.__init__() # [...] Delegating to an ancestor class by calling an unbound method is fine as long as one remembers to pass an instance as the first argument. So, this means: shortList.setList(self) and shortList.__init__(self) for the examples above. -- Regards, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: How to check if a string is empty in python?
On May 2, 1:35 pm, [EMAIL PROTECTED] wrote: How to check if a string is empty in python? if(s == ) ?? Empty strings and containers are false; so one can write if (not s): print something... -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: sqlite for mac?
On May 1, 10:12 am, 7stud [EMAIL PROTECTED] wrote: On May 1, 4:08 am, Daniel Nogradi [EMAIL PROTECTED] wrote: Does sqlite come in a mac version? The interface (pysqlite) is part of the python 2.5 standard library but you need to install sqlite itself separately (as far as I remember) fromwww.sqlite.org Daniel I'm using python 2.4.4 because the download said there were more mac modules available for 2.4.4. than 2.5, and I can't seem to locate a place to download sqlite for mac. Did you install Xcode on your Mac? If so then you should have access to a C compiler allowing you to compile sqlite from source: http://sqlite.org/download.html I checked fink (finkproject.org) but that web site shows no binary distributions for sqlite3: http://pdb.finkproject.org/pdb/package.php/sqlite3 -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: python function in pipe
On Apr 28, 6:37 am, Bart [EMAIL PROTECTED] wrote: Hi everyone! Im using module that gives errors to stderr/stdout (generated by SWIG) Problem is that I need to parse this errors/information from module. os.popen3 looks nice but this executes command not function. Is there any solution? Perhaps you're looking for the unittest module? You can use assertRaises if an exception is raised by the function. You can also redirect sys.stderr and sys.stdout as needed and test the captured strings with assertEquals. Else you can wrap the module under test in another module: # mytest.py import module_under_test if __name__ == __main__: module_under_test.foo() Then, using os.popen3 (or subprocess), run python mytest.py as your command. -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: function minimization
On Apr 22, 6:55 am, [EMAIL PROTECTED] [EMAIL PROTECTED] wrote: Is anyone aware of python library that does function minimization a la Minuit (http://wwwasdoc.web.cern.ch/wwwasdoc/minuit/) used by CERN? thanks If you have a C complier and the lapack, blas, and levmar libraries, you could try pylevmar: http://projects.liquidx.net/python/browser/pylevmar/trunk/setup.py -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Suggestion: str.itersplit()
On Apr 21, 5:58 am, Dustan [EMAIL PROTECTED] wrote: From my searches here, there is no equivalent to java's StringTokenizer in python, which seems like a real shame to me. However, str.split() works just as well, except for the fact that it creates it all at one go. I suggest an itersplit be introduced for lazy evaluation, if you don't want to take up recourses, and it could be used just like java's StringTokenizer. Comments? If your delimiter is a non-empty string, you can use an iterator like: def it(S, sub): start = 0 sublen = len(sub) while True: idx = S.find(sub,start) if idx == -1: yield S[start:] raise StopIteration else: yield S[start:idx] start = idx + sublen target_string = 'abcabcabc' for subs in it(target_string,'b'): print subs For something more complex, you may be able to use re.finditer. -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: multiremberco
On Apr 19, 9:13 am, Anton Vredegoor [EMAIL PROTECTED] wrote: (snipped) How about this one? No that can result in an infinite loop after yet another print it1.next() This one however ... from collections import deque class sentinel(object): pass class myiter(object): def __init__(self,seq): self.seq = seq self.index = -1 def __iter__(self): return self def next(self): self.index +=1 if self.index len(self.seq): return self.seq[self.index] else: return sentinel def xsplitter(seq, pred): Q = deque(),deque() it = myiter(seq) def gen(p): for x in it: while Q[p]: yield Q[p].popleft() if x is sentinel: break if pred(x) == p: yield x else: Q[~p].append(x) for x in gen(p): yield x return gen(1),gen(0) def test(): L = 'a', 1, 2, 'a' it1, it2 = xsplitter(L, lambda x: x == 'a') print it1.next() print it2.next() print it1.next() print it2.next() if __name__=='__main__': test() A. Um, no. That one stops prematurely if your input sequence is: L = 1, 2, 3, 'a', 'a' You get points for persistence, however. :) -- Regards, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: multiremberco
On Apr 19, 3:37 pm, Anton Vredegoor [EMAIL PROTECTED] wrote: Anton Vredegoor wrote: Maybe this one is better? No, this one keeps generating output. But this one stops at least: from collections import deque from itertools import chain, repeat def xsplitter(seq, pred): Q = deque(),deque() sentinel = object() it = chain(seq,repeat(sentinel)) def gen(p): for x in it: if x is sentinel: while Q[p]: yield Q[p].popleft() break elif pred(x) == p: while Q[p]: yield Q[p].popleft() yield x else: Q[~p].append(x) for x in gen(p): yield x return gen(1),gen(0) def test(): L = 1, 2, 3, 'a', 'a' #L = 'a', 1, 2, 'a' #L = 1, 'a', 3, 'a', 4, 5, 6, 'a' it1, it2 = xsplitter(L, lambda x: x == 'a') print it1.next() print it2.next() print it1.next() print it2.next() if __name__=='__main__': test() Are there any other cases this doesn't cover? A. This one gets the order wrong. With def test(): L = 1, 2, 3, 'a', 4, 'a', 5, 'a', 6, 'a' it1, it2 = xsplitter(L, lambda x: x == 'a') print it1.next() print it2.next() print it1.next() print it2.next() print it1.next() print it2.next() print it1.next() print it2.next() 5 will appear before 4. -- Regards, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: multiremberco
On Apr 17, 3:52 pm, [EMAIL PROTECTED] wrote: (snipped) So far I haven't succed using the coroutine Python 2.5 allows using the generators, and I think still that xsplitter can be done with two coroutines instead of two It objects. Despite Steven's code I am unable still to write a working code with coroutines (probably because I haven't understood how they work yet). This time I take a breath and I show my wrong code: import collections def xsplitter(iseq, pred): def it(parity): queue = collections.deque() while True: received = (yield) if received is not None: queue.append(received) if queue: yield queue.popleft() else: try: el = iseq.next() if pred(el) == parity: yield el else: its[not parity].send(el) except StopIteration: raise its = [it(False), it(True)] return its[True], its[False] idata = iter([1, 'a', 3, 'a', 4, 5, 6, 'a']) it1, it2 = xsplitter(idata, lambda x: x == 'a') from itertools import izip for el1, el2 in izip(it1, it2): print el1, el2 It prints: None None None None a 3 None None a 4 None None None None None None Can it be fixed? Are you able to fix it for me? (If you want you can think of it as an exercise to understand Python coroutines :-) ). I don't think coroutine are what's needed here. In particular, using 'send' will *deplete* the iterator -- the very iterator to which one is trying to add an element. If you don't wish to use objects, you can replace them with a closure: import collections def xsplitter(iseq, pred): queue = [ collections.deque(), collections.deque() ] def it(parity): while True: if queue[parity]: yield queue[parity].popleft() else: try: el = iseq.next() if pred(el) == parity: yield el else: queue[not parity].append(el) except StopIteration: raise its = [ it(False), it(True) ] return its[True], its[False] idata = iter([1, 'a', 3, 'a', 4, 5, 6, 'a']) it1, it2 = xsplitter(idata, lambda x: x == 'a') from itertools import izip for el1, el2 in izip(it1, it2): print el1, el2 Oh, I and do like your rewrite; it's much less repetitive and cleaner than my original version. -- Regards, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: multiremberco
On Apr 18, 12:23 pm, Anton Vredegoor [EMAIL PROTECTED] wrote: (snipped) But still, the 'while True:' loop and the 'try-except' clause and the explicit StopIteration are not necessary ... from collections import deque def xsplitter(seq, pred): Q = deque(),deque() it = iter(seq) def gen(p): while Q[p]: yield Q[p].popleft() for x in it: if pred(x) == p: yield x else: Q[~p].append(x) for x in gen(p): yield x return gen(1),gen(0) def test(): L = 1, 'a', 3, 'a', 4, 5, 6, 'a' it1, it2 = xsplitter(L, lambda x: x == 'a') print it1.next() print it2.next() print it1.next() if __name__=='__main__': test() A. Try it with def test(): L = 'a', 1, 2, 'a' it1, it2 = xsplitter(L, lambda x: x == 'a') print it1.next() print it2.next() print it1.next() print it2.next() The last print statement raises StopIteration... We, however, expected each iterator to contain two elements (one yielding 'a' then 'a', and the other yielding 1 then 2). -- Regards, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: multiremberco
On Apr 16, 5:14 pm, [EMAIL PROTECTED] wrote: Once in while I too have something to ask. This is a little problem that comes from a Scheme Book (I have left this thread because this post contains too much Python code for a Scheme newsgroup):http://groups.google.com/group/comp.lang.scheme/browse_thread/thread/... (snipped) For fun I have tried to make it lazy, if may be useful if seq is a very long iterable. So I've used tee: from itertools import ifilter, tee def multiremberandco4(el, iseq, fun): iseq1, iseq2 = tee(iseq) iterable1 = ifilter(lambda x: x == el, iseq1) iterable2 = ifilter(lambda x: x != el, iseq2) return fun(iterable1, iterable2) def leniter(seq): count = 0 for el in seq: count += 1 return count idata = iter(data) print multiremberandco4('a', idata, lambda l1,l2: (leniter(l1), leniter(l2))) But from the docs: in general, if one iterator is going to use most or all of the data before the other iterator, it is faster to use list() instead of tee(). So I have tried to create two iterables for the fun function scanning seq once only, but I haven't succed so far (to do it I have tried to use two coroutines with the enhanced generators, sending el to one or to the other according to the value of x == el, this time I don't show my failed versions), do you have suggestions? Scan once, two iterables: class It(object): def __init__(self, iseq, fun, fun2): self.iseq = iseq self.wanted = fun self.queue = [] self.divert = fun2 def append(self, item): self.queue.append(item) def __iter__(self): while True: if self.queue: yield self.queue.pop(0) else: try: item = self.iseq.next() if self.wanted(item): yield item else: self.divert(item) except StopIteration: raise class TwoFromOne(object): def __init__(self, iseq, el): self.i1 = It(iseq, lambda x: x == el, lambda y: self.i2.append(y)) self.i2 = It(iseq, lambda x: x != e1, lambda y: self.i1.append(y)) def getiters(self): return self.i1, self.i2 def leniter(seq): count = 0 for el in seq: count += 1 return count data = [1, 'a', 3, 'a', 4, 5, 6, 'a'] lazy_eye = TwoFromOne(iter(data), 'a') it1, it2 = lazy_eye.getiters() print (lambda i1, i2: (leniter(i1), leniter(i2)))(it1, it2) -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: script for seconds in given month?
On Apr 16, 10:18 am, [EMAIL PROTECTED] wrote: Matt from time import mktime Matt def secondsInMonth(year, month): Matt s1 = mktime((year,month,1,0,0,0,0,0,-1)) Matt s2 = mktime((year,month+1,1,0,0,0,0,0,-1)) Matt return s2-s1 Probably won't work if month==12. ;-) Skip Actually, mktime as described in the C Standard does not restrict members such as tm_mon of struct tm to the range 0-11 (1-12 for the corresponding entry in the time tuple in Python). So the underlying struct in CPython may be normalized and return a perfectly valid time even if month is 12. -- Regards, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: unittest assertRaises Problem
On Apr 16, 3:13 pm, john [EMAIL PROTECTED] wrote: All: Hi. I am an experienced developer (15 yrs), but new to Python and have a question re unittest and assertRaises. No matter what I raise, assertRaises is never successful. Here is the test code: class Foo: def testException(self): raise ValueError class FooTestCase(unittest.TestCase): testTryThis(self): f = Foo() self.assertRaises(ValueError, f.testException()) The second argument should be a callable object, not the result from invoking that callable object. Thus, change self.assertRaises(ValueError, f.testException()) to self.assertRaises(ValueError, f.testException) -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: list insertion question
On Apr 16, 6:05 pm, [EMAIL PROTECTED] wrote: hi i have a list (after reading from a file), say data = [ 'a','b','c','d','a','b','e','d'] I wanted to insert a word after every 'a', and before every 'd'. so i use enumerate this list: for num,item in enumerate(data): if a in item: data.insert(num+1,aword) if d in item: data.insert(num-1,dword) #this fails but the above only inserts after 'a' but not before 'd'. What am i doing wrong? is there better way?thanks Traverse the list from highest index to lowest index: data = [ 'a', 'b', 'c', 'd', 'a', 'b', 'e', 'd' ] print data for idx, value in reversed(list(enumerate(data))): if value == 'a': data.insert(idx+1, 'aword') elif value == 'd': data.insert(idx, 'dword') print data # OR last_idx = len(data) - 1 for idx in range(last_idx+1): ridx = last_idx - idx if data[ridx] == 'a': data.insert(ridx+1, 'aword') elif data[ridx] == 'd': data.insert(ridx, 'dword') print data -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Cloning file attributes and permissions
On Apr 12, 9:20 am, Paulo da Silva [EMAIL PROTECTED] wrote: Hi! I need to process a file to produce another file that *must* have *exactly* the same attributes and permissions of the former. What is the best way to do this? The file must not exist with contents (it may exist empty) unless it has the same attributes and permissions. I know how to do this using, let me call it, C type code (stat, chmod, chown, etc). I would like to hear some opinions on if and how it would be possible in a more elegant/python way. Are you using a system that supports the creation of a hard link? If so, try os.link. -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Cloning file attributes and permissions
On Apr 12, 4:09 pm, Paulo da Silva [EMAIL PROTECTED] wrote: [EMAIL PROTECTED] escreveu: On Apr 12, 9:20 am, Paulo da Silva [EMAIL PROTECTED] wrote: Hi! I need to process a file to produce another file that *must* have *exactly* the same attributes and permissions of the former. What is the best way to do this? The file must not exist with contents (it may exist empty) unless it has the same attributes and permissions. I know how to do this using, let me call it, C type code (stat, chmod, chown, etc). I would like to hear some opinions on if and how it would be possible in a more elegant/python way. Are you using a system that supports the creation of a hard link? If so, try os.link. May be I missed something exposing my q. I need to process an input file foo to produce a different contents file bar. bar must have the same attributes/permissions of foo. I forgot to say that the OS is Linux. Sorry, I did misunderstand your question at first. Well, you do have stat, chown, chmod in Python; but if you're on Linux, you might just want to use the cp command with the -p switch: import subprocess retcode = subprocess.call([ /bin/cp, -p, oldfile, newfile ]) On my system, this preserves the access permissions and ownership. And if you modify the file after copying, you can alter the access and modification times with posix.utime to match that of the original. -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Cloning file attributes and permissions
On Apr 12, 5:19 pm, [EMAIL PROTECTED] wrote: On Apr 12, 4:09 pm, Paulo da Silva [EMAIL PROTECTED] wrote: (snipped) import subprocess retcode = subprocess.call([ /bin/cp, -p, oldfile, newfile ]) On my system, this preserves the access permissions and ownership. And if you modify the file after copying, you can alter the access and modification times with posix.utime to match that of the original. After poking around a bit I also discovered the shutil module. It looks like you can use shutil.copy2. More Pythonic, yes? -- Regards, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: python regular expression help
On Apr 11, 9:50 pm, Gabriel Genellina [EMAIL PROTECTED] wrote: En Wed, 11 Apr 2007 23:14:01 -0300, Qilong Ren [EMAIL PROTECTED] escribió: Thanks for reply. That actually is not what I want. Strings I am dealing with may look like this: s = 'a = 4.5 b = 'h' 'd' c = 4.5 3.5' What I want is a = 4.5 b = 'h' 'd' c = 4.5 3.5 That's a bit tricky. You have LHS = RHS where RHS includes all the following text *except* the very next word before the following = (which is the LHS of the next expression). Or something like that :) py import re py s = a = 4.5 b = 'h' 'd' c = 4.5 3.5 py r = re.compile(r\w+\s*=\s*.*?(?=\w+\s*=|$)) py for item in r.findall(s): ... print item ... a = 4.5 b = 'h' 'd' c = 4.5 3.5 Another way is to use split: import re lhs = re.compile(r'\s*(\b\w+\s*=)') for s in [ a = 4 b =3.4 5.4 c = 4.5, a = 4.5 b = 'h' 'd' c = 4.5 3.5]: tokens = lhs.split(s) results = [tokens[_] + tokens[_+1] for _ in range(1,len(tokens), 2)] print s print results -- Regards, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Database Timestamp conversion error
On Apr 6, 1:48 pm, [EMAIL PROTECTED] wrote: (snipped) If I look in the MS Access database, I see the timestamp as 5/6/112. Obviously some user didn't enter the correct date and the programmer before me didn't give Access strict enough rules to block bad dates. How do I test for a malformed date object so I can avoid this? There are thousands of records to transfer. time.strptime ? import time for date in (5/6/2008, 5/6/118): try: struct_tm = time.strptime(date, %m/%d/%Y) print Good date: + date print struct_tm except ValueError: print Bad date: + date -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: how to remove multiple occurrences of a string within a list?
On Apr 4, 7:43 pm, [EMAIL PROTECTED] (Alex Martelli) wrote: (snipped) A we-don't-need-no-stinkin'-one-liners more relaxed approach: import collections d = collections.defaultdict(int) for x in myList: d[x] += 1 list(x for x in myList if d[x]==1) yields O(N) performance (give that dict-indexing is about O(1)...). Collapsing this kind of approach back into a one-liner while keeping the O(N) performance is not easy -- whether this is a fortunate or unfortunate ocurrence is of course debatable. If we had a turn sequence into bag function somewhere (and it might be worth having it for other reasons): def bagit(seq): import collections d = collections.defaultdict(int) for x in seq: d[x] += 1 return d then one-linerness might be achieved in the gimme nonduplicated items task via a dirty, rotten trick...: list(x for bag in [bagit(myList)] for x in myList if bag[x] == 1) ...which I would of course never mention in polite company... Alex With a context managed set one could have, as a one-liner: with cset() as s: retval = [ (x, s.add(x))[0] for x in myList if x not in s ] I've not looked at the underlying implementation of set(), but I presume that checking set membership is also about O(1). -- Cheers, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: elementary tuple question. (sorry)
On Apr 5, 2:08 pm, Steven W. Orr [EMAIL PROTECTED] wrote: I have a tuple that I got from struct.unpack. Now I want to pass the data from the returned tuple to struct.pack fmt 'l 10l 11i h 4h c 47c 0l'struct.pack(fmt, tup) Traceback (most recent call last): File stdin, line 1, in ? struct.error: required argument is not an integer What's the idiom to pass the data in tup? Try mystring = struct.pack(fmt, *tup) -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: grandparent method with super
On Apr 5, 2:13 pm, Martin Manns [EMAIL PROTECTED] wrote: On Thu, 5 Apr 2007 16:55:38 -0400 John Clark [EMAIL PROTECTED] wrote: That works, but when I replace A with something else, I do not get the grandparent anymore without changing all the method calls. Basically, I would like to call the method m in the first grandparent of D. Martin I think the problem you may run into is with the term first grandparent - when you look at the method resolution order of the class D, you will find that the MRO goes D, C, B, A... I think it's going to be difficult to figure out where the first grandparent is in the MRO. For example: class A(object): def m(self): pass class B(A): def m(self): pass class C(B): def m(self): pass class D(A): def m(self): pass class E(C,D): def m(self): firstgrandparent(E,self).m() #Should call B.m class F(D,C): def m(self): firstgrandparent(F,self).m() # Should call F.m The mro for class E is going to be E,C,B,D,A where as the mro for class F is going to be F,D,C,B,A. However, the first grandparent for E should be B, where as the first grandparent for F should be A. Because the MRO isn't just a depth first traversal, the term first grandparent gets tricky to define... Not really. The first grandparent would be the first occurrence in the list from left to right, which satisfies the requirement that its shortest path to the current class is 2. The only problem: How do I get it? Martin class E(C,D): def m(self): for cls in E.__mro__: if cls != E and cls not in E.__bases__: cls.m(self) break ... but it's probably better that you rethink your class hierarchy. -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: calling super()
On Apr 4, 12:22 pm, [EMAIL PROTECTED] wrote: Hello, I have been trying to call the super constructor from my derived class but its not working as expected. See the code: class HTMLMain: def __init__(self): self.text = HTMLBODY; print(self.text); def __del__(self): self.text = /BODY/HTML; print(self.text); class NewPage(HTMLMain): def __init__(self): print 'derive2 init' super(NewPage, self).__init__(); N = NewPage(); del N And here's the error message I get: The error message is trying to tell you that 'super' should be used with new style classes. So, class HTMLMain: should be class HTMLMain(object): -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Newbie Question about sequence multiplication
On Apr 4, 3:19 pm, Scott [EMAIL PROTECTED] wrote: (snipped) print print ' ' * left_margin + '+' + '-' * (box_width-2) + '+' print ' ' * left_margin + '| ' + ' ' * text_width + ' |' print ' ' * left_margin + '| ' + ' ' sentence + ' |' print ' ' * left_margin + '| ' + ' ' * text_width + ' |' print ' ' * left_margin + '+' + '-' * (box_width-2) + ' |' print end code Now that, even though copied straight from Beginning Python: From Novice to Professional, returns : There's an error in your program: invalid syntax (snipped) Others have pointed out the mistake. I'll just add that in this particular case, one might want to pad lines with some whitespace and change the middle print statement to: print print ' ' * left_margin + '+' + '-' * box_width + '+' print ' ' * left_margin + '|' + '-' * box_width + '|' print ' ' * left_margin + '|' + sentence.center(box_width) + '|' print ' ' * left_margin + '|' + '-' * box_width + '|' print ' ' * left_margin + '+' + '-' * box_width + '+' to improve legibility. -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Overlapping matches
On Apr 1, 1:38 pm, Rehceb Rotkiv [EMAIL PROTECTED] wrote: In the re documentation, it says that the matching functions return non- overlapping matches only, but I also need overlapping ones. Does anyone know how this can be done? Perhaps lookahead assertions are what you're looking for? import re import string non_overlap = re.compile(r'[0-9a-fA-F]{2}') pairs = [ match.group(0) for match in non_overlap.finditer(string.hexdigits) ] print pairs overlap = re.compile(r'[0-9a-fA-F](?=([0-9a-fA-F]))') pairs = [ match.group(0) + match.group(1) for match in overlap.finditer(string.hexdigits) ] print pairs -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Sorting a multidimensional array by multiple keys
On Mar 31, 6:42 am, Rehceb Rotkiv [EMAIL PROTECTED] wrote: (snipped) As each line consists of 5 words, I would break up the data into an array of five-field-arrays (Would you use lists or tuples or a combination in Python?). The word BUT would be in the middle, with two fields/words left and two fields/words right of it. I then want to sort this list by - field 3 - field 4 - field 1 - field 0 import StringIO buf = reaction is BUT by the sodium , BUT it is sea , BUT it is this manner BUT the dissolved pattern , BUT it is rapid , BUT it is .lstrip() mockfile = StringIO.StringIO(buf) tokens = [ line.split() + [ line ] for line in mockfile ] tokens.sort(key=lambda l: (l[3], l[4], l[1], l[0])) for l in tokens: print l[-1], -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: make RE more cleaver to avoid inappropriate : sre_constants.error: redefinition of group name
On Mar 29, 7:22 am, aspineux [EMAIL PROTECTED] wrote: I want to parse '[EMAIL PROTECTED]' or '[EMAIL PROTECTED]' and get the email address [EMAIL PROTECTED] the regex is r'[EMAIL PROTECTED]|[EMAIL PROTECTED]' now, I want to give it a name r'(?Pemail[EMAIL PROTECTED])|(?Pemail[EMAIL PROTECTED])' sre_constants.error: redefinition of group name 'email' as group 2; was group 1 BUT because I use a | , I will get only one group named 'email' ! Any comment ? PS: I know the solution for this case is to use r'(?Plt)?(?Pemail [EMAIL PROTECTED])(?(lt))' Regular expressions, alternation, named groups ... oh my! It tends to get quite complex especially if you need to reject cases where the string contains a left bracket and not the right, or visa-versa. pattern = re.compile(r'(?Pemail[EMAIL PROTECTED]|(?!)[EMAIL PROTECTED](?!))') for email in ('[EMAIL PROTECTED]' , '[EMAIL PROTECTED]', '[EMAIL PROTECTED]'): ... matched = pattern.search(email) ... if matched is not None: ... print matched.group('email') ... [EMAIL PROTECTED] [EMAIL PROTECTED] I suggest you try some other solution (maybe pyparsing). -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Creating a new data structure while filtering its data origin.
On Mar 28, 1:44 pm, [EMAIL PROTECTED] wrote: Hi everyone. I'm trying to work with very simple data structures but I'm stuck in the very first steps. If someone has the luxury of a few minutes and can give an advice how to resolve this, I'll really appreciate it. 1- I have a list of tuples like this: lista= [(162, 141, 3), (162, 141, 3), (162, 141, 3), (168, 141, 2), (168, 141, 2), (168, 141, 2), (201, 141, 1), (213, 141, 1), (203, 141, 1), (562, 142, 4), (562, 142, 4), (562, 142, 4), (568, 142, 2), (568, 142, 2), (568, 142, 2), (501, 142, 1), (513, 142, 1), (503, 142, 1)] and I want to end with a dict like this: {141: {1: [203, 213, 201], 2: [168, ], 3: [162, ]}, 142: {1: [503, 513, 501], 2: [568, ], 4: [562, ]}} (snipped) I think you can use, with python 2.5, defaultdict for this. I only have access to 2.4.4 here, so my facsimile is: class defaultd(dict): def __getitem__(self, k): if k not in self: self[k] = defaultd() return dict.__getitem__(self, k) lista = [(162, 141, 3), (162, 141, 3), (162, 141, 3), (168, 141, 2), (168, 141, 2), (168, 141, 2), (201, 141, 1), (213, 141, 1), (203, 141, 1), (562, 142, 4), (562, 142, 4), (562, 142, 4), (568, 142, 2), (568, 142, 2), (568, 142, 2), (501, 142, 1), (513, 142, 1), (503, 142, 1)] dd = defaultd() for value, outerkey, innerkey in lista: li = dd[outerkey].setdefault(innerkey, []) if value not in li: li.insert(0, value) # or, li.append(value) if you want to reverse order print dd I happen to like the autovivification feature found in perl and was pleased to see defaultdict in python 2.5. OTOH, python programmers more experienced than I might see this and run away screaming. -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Weird gcc behaviour with function pointer types
On Mar 29, 6:05 am, greg [EMAIL PROTECTED] wrote: In my quest to eliminate C compiler warnings from Pyrex output, I've discovered some utterly bizarre behaviour from gcc 3.3. The following code: void g(struct foo *x) { } void f(void) { void (*h)(struct foo *); h = g; } produces the following warning: blarg.c: In function `f': blarg.c:6: warning: assignment from incompatible pointer type However, adding the following line at the top: typedef struct foo Foo; makes the warning go away. The mere *presence* of the typedef is all that's needed -- it doesn't even have to be used. This looks like a bug in gcc to me -- what do people think? Was there no (forward) declaration nor definition of struct foo ahead of your functions? I get no warnings with this: struct foo; /* forward declaration */ void g(struct foo *x) { } void f(void) { void (*h)(struct foo *); h = g; } Using: Target: powerpc-apple-darwin8 Configured with: /private/var/tmp/gcc/gcc-5026.obj~19/src/configure -- disable-checking --prefix=/usr --mandir=/share/man --enable- languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^+.-]*$/s/ $/-4.0/ --with-gxx-include-dir=/include/gcc/darwin/4.0/c++ -- build=powerpc-apple-darwin8 --host=powerpc-apple-darwin8 -- target=powerpc-apple-darwin8 Thread model: posix gcc version 4.0.0 (Apple Computer, Inc. build 5026) -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: call to function by text variable
On Mar 25, 3:36 pm, ianaré [EMAIL PROTECTED] wrote: yeah the subject doesn't really make sense does it? anyway want I want to do is this: if n == 1: self.operations.insert(pos, operations.Replace.Panel(self, main)) elif n == 2: self.operations.insert(pos, operations.ChangeCase.Panel(self, main)) elif n == 3: self.operations.insert(pos, operations.Move.Panel(self, main)) As you can see all the different functions have the same variables, so it would be easier if I could just make a list and use that. # Your list would contain the unbound functions: unbound_funcs = [operations.Replace.Panel, operations.Change.Panel, operations.Move.Panel] # and invocation would be: self.operations.insert(pos, unbound_funcs[n - 1](self, main)) -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Daylight saving time question
On Mar 20, 12:53 pm, Mr Pekka Niiranen [EMAIL PROTECTED] wrote: Hi, is it possible to get the two annual daylight saving times (day, month and time) from Python by giving location in some country/location string (Europe/Finland for example). I need to ask country in program and calculate daylight saving times for the next few years onwards somehow like this: for y in range(2007, 2017): (m1,d1,t1,m2,d2,t2) = daylight_change_epochs(Finland) -pekka- A generator defined via recursion: import dateutil.rrule, dateutil.tz import datetime mytz = dateutil.tz.tzfile(/usr/share/zoneinfo/Europe/Helsinki) start = datetime.datetime(2007,1,1,0,0,0,tzinfo=mytz) end = datetime.datetime(2017,1,1,0,0,0,tzinfo=mytz) successively_finer = { dateutil.rrule.WEEKLY: dateutil.rrule.DAILY, dateutil.rrule.DAILY: dateutil.rrule.HOURLY, dateutil.rrule.HOURLY: dateutil.rrule.MINUTELY, dateutil.rrule.MINUTELY: dateutil.rrule.SECONDLY } # find week, then day, then hour, etc. that spans a change in DST def sieve (start, end, freq): dstflag = start.timetuple()[-1] iter = dateutil.rrule.rrule(freq,dtstart=start,until=end) tprior = start for t in iter: if t.timetuple()[-1] != dstflag: dstflag = t.timetuple()[-1] if freq == dateutil.rrule.SECONDLY: yield tprior, t else: yield sieve(tprior, t, successively_finer[freq]).next() tprior = t raise StopIteration for before, after in sieve(start, end, dateutil.rrule.WEEKLY): print %s = %s % ( before.strftime(%Y-%m-%d %H:%M:%S (%a) %Z), after.strftime(%Y-%m-%d %H:%M:%S (%a) %Z)) I get: 2007-03-25 02:59:59 (Sun) EET = 2007-03-25 03:00:00 (Sun) EEST 2007-10-28 02:59:59 (Sun) EEST = 2007-10-28 03:00:00 (Sun) EET 2008-03-30 02:59:59 (Sun) EET = 2008-03-30 03:00:00 (Sun) EEST 2008-10-26 02:59:59 (Sun) EEST = 2008-10-26 03:00:00 (Sun) EET 2009-03-29 02:59:59 (Sun) EET = 2009-03-29 03:00:00 (Sun) EEST 2009-10-25 02:59:59 (Sun) EEST = 2009-10-25 03:00:00 (Sun) EET 2010-03-28 02:59:59 (Sun) EET = 2010-03-28 03:00:00 (Sun) EEST 2010-10-31 02:59:59 (Sun) EEST = 2010-10-31 03:00:00 (Sun) EET 2011-03-27 02:59:59 (Sun) EET = 2011-03-27 03:00:00 (Sun) EEST 2011-10-30 02:59:59 (Sun) EEST = 2011-10-30 03:00:00 (Sun) EET 2012-03-25 02:59:59 (Sun) EET = 2012-03-25 03:00:00 (Sun) EEST 2012-10-28 02:59:59 (Sun) EEST = 2012-10-28 03:00:00 (Sun) EET 2013-03-31 02:59:59 (Sun) EET = 2013-03-31 03:00:00 (Sun) EEST 2013-10-27 02:59:59 (Sun) EEST = 2013-10-27 03:00:00 (Sun) EET 2014-03-30 02:59:59 (Sun) EET = 2014-03-30 03:00:00 (Sun) EEST 2014-10-26 02:59:59 (Sun) EEST = 2014-10-26 03:00:00 (Sun) EET 2015-03-29 02:59:59 (Sun) EET = 2015-03-29 03:00:00 (Sun) EEST 2015-10-25 02:59:59 (Sun) EEST = 2015-10-25 03:00:00 (Sun) EET 2016-03-27 02:59:59 (Sun) EET = 2016-03-27 03:00:00 (Sun) EEST 2016-10-30 02:59:59 (Sun) EEST = 2016-10-30 03:00:00 (Sun) EET -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: using regexp
On Mar 19, 10:33 pm, [EMAIL PROTECTED] wrote: hi how can i use regexp to group these digits into groups of 3? eg line 123456789123456789 i have : pat = re.compile(line\s+(\d{3}) , re.M|re.DOTALL) but this only gives the first 3. I also tried line\s+(\d{3})+ but also not working. I need output to be ['123' ,'456','789', '123','456','789', .] thanks. Try: import re target_string = not 123456789 but try this line 987654321 try: digits = re.compile(r'line\s+(\d +)').search(target_string).group(1) except AttributeError: digits = '' three_at_a_time = re.compile(r'\d{3}').findall(digits) print three_at_a_time -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: string formatting: engineering notation
On Mar 14, 1:14 pm, Darren Dale [EMAIL PROTECTED] wrote: Does anyone know if it is possible to represent a number as a string with engineering notation (like scientific notation, but with 10 raised to multiples of 3: 120e3, 12e-6, etc.). I know this is possible with the decimal.Decimal class, but repeatedly instantiating Decimals is inefficient for my application (matplotlib plotting library). If it is not currently possible, do you think the python devs would be receptive to including support for engineering notation in future releases? Do you also consider this to be too inefficient? import math for exponent in xrange(-10, 11): flt = 1.23 * math.pow(10, exponent) l = math.log10(flt) if l 0: l = l - 3 p3 = int(l / 3) * 3 multiplier = flt / pow(10, p3) print '%e = %fe%d' % (flt, multiplier, p3) -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: How to capture environment state after running a shell script.
On Mar 13, 5:57 am, Gerard Flanagan [EMAIL PROTECTED] wrote: Hello, I have a third party shell script which updates multiple environment values, and I want to investigate (and ultimately capture to python) the environment state after the script has run. But running the script as a child process only sets values for that process, which are lost after execution. So I thought I could simply tack on an 'env' command line to the script input lines as shown below. However, using subprocess.Popen gives the error shown (even though the docs say that any file object may be used for stdin), and using popen2 hangs indefinitely. I think I'm missing something basic, any advice? Or is there a better approach? (snipped) ## first method ## p = Popen('/bin/sh', stdin=buf) print p.stdout.readlines() Traceback (most recent call last): File scratch.py, line 36, in ? p = Popen('/bin/sh', stdin=buf) File /usr/local/lib/python2.4/subprocess.py, line 534, in __init__ (p2cread, p2cwrite, File /usr/local/lib/python2.4/subprocess.py, line 830, in _get_handles p2cread = stdin.fileno() AttributeError: StringIO instance has no attribute 'fileno' ## second method ## cmdout, cmdin = popen2('/bin/sh') for line in buf: cmdin.write(line) ret = cmdout.readlines() cmdout.close() cmdin.close() print ret First close the input so that the (sub) process knows to terminate and flush the output. Then, you can read from the output: import subprocess import popen2 p = subprocess.Popen([/bin/sh], stdin=subprocess.PIPE, stdout=subprocess.PIPE) p.stdin.write(env -i FOO=BAR\n) p.stdin.close() status = p.wait() ret = p.stdout.readlines() p.stdout.close() print ret # Or cmdout, cmdin = popen2.popen2(/bin/sh) cmdin.write(env -i FOO=BAR\n) cmdin.close() ret = cmdout.readlines() cmdout.close print ret -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Newbie Question : grep
On Mar 12, 10:01 am, Erik Johnson [EMAIL PROTECTED] wrote: Sorry, I forgot to paste the modified version of my code in the post:. I think this is the same behaviour: for line in lines: if placed in line: if i_a/i_b/ROM/ in line: pos = (line.split()[4]).split(_)[1] found = False for (tag, (start, end)) in tags: if tag in line: found = True print i_a/i_b/ROM/%s [%i:%i] LOC = %\ (pos, tag, start, end) break if not found: print Error Instead of using a sentinal value (i.e., found), one can use the 'else' clause of a 'for' loop... pos = (line.split()[4]).split(_)[1] for (tag, (start,end)) in tags: if tag in line: print i_a/i_b/ROM/%s [%i:%i] LOC=%s %\ (pos,tag,start,end) break else print Error -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Request for a change in the csv module.
On Mar 12, 4:26 pm, Paulo da Silva [EMAIL PROTECTED] wrote: Hi. I have just seen that csv module, more exactly the Dialect class, does not have any variable to specify the floating point character! In portuguese this is ','. Not '.'. 3.1415 - 3,1415. I think this is also the case of other languages/countries. If I am correct, i.e. if there is no such possibility, where can I file a request for a csv change? Excel, for example, automatically converts '.' to ',' and the separator from ',' to ';'. Try using locale.format when writing: import csv import locale locale.setlocale(locale.LC_NUMERIC, 'pt_BR.ISO8859-1') csv_writer = csv.writer(open(foo.csv,w), dialect='excel') rows = (('testing', 1.23), ('testing', 2.34)) formatted_rows = ((string, locale.format('%g', number)) for (string,number) in rows) csv_writer.writerows(formatted_rows) locale.atof and locale.atoi can convert a string back to a number. -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Reading a portion of a file
On Mar 8, 10:35 am, [EMAIL PROTECTED] wrote: (snipped) Ok, regex was my first thought because I used to use grep with Perl and shell scripting to grab everything from one pattern to another pattern. The file is just an unformatted file. What is below is exactly what is in the file. There are no spaces between the beginning and ending tags and the content. Would you recommend using spaces there? And if so, why? A sample of the file: You can use iterators: import StringIO import itertools def group(line): if line[-6:-1] == 'START': group.current = group.current + 1 return group.current group.current = 0 data = #VS:COMMAND:df:START Filesystem 1K-blocks Used Available Use% Mounted on /dev/vzfs 20971520517652 20453868 3% / tmpfs 201603244 2015988 1% /var/run tmpfs 2016032 0 2016032 0% /var/lock tmpfs 2016032 0 2016032 0% /dev/shm tmpfs 201603244 2015988 1% /var/run tmpfs 2016032 0 2016032 0% /var/lock #VS:COMMAND:df:STOP #VS:FILE:/proc/loadavg:START 0.00 0.00 0.00 1/32 14543 #VS:FILE:/proc/loadavg:STOP #VS:FILE:/proc/meminfo:START MemTotal: 524288 kB MemFree:450448 kB Buffers: 0 kB Cached: 0 kB SwapCached: 0 kB Active: 0 kB Inactive:0 kB HighTotal: 0 kB HighFree:0 kB LowTotal: 524288 kB LowFree:450448 kB SwapTotal: 0 kB SwapFree:0 kB Dirty: 0 kB Writeback: 0 kB Mapped: 73840 kB Slab:0 kB CommitLimit: 0 kB Committed_AS: 248704 kB PageTables: 0 kB VmallocTotal:0 kB VmallocUsed: 0 kB VmallocChunk:0 kB #VS:FILE:/proc/meminfo:STOP #VS:FILE:/proc/stat:START cpu 67188 0 26366 391669264 656686 0 0 cpu0 24700 0 10830 195807826 373309 0 0 cpu1 42488 0 15536 195861438 283376 0 0 intr 0 swap 0 0 ctxt 18105366807 btime 1171391058 processes 26501285 procs_running 1 procs_blocked 0 #VS:FILE:/proc/stat:STOP #VS:FILE:/proc/uptime:START 1962358.88 1577059.05 #VS:FILE:/proc/uptime:STOP .lstrip(\n); fh = StringIO.StringIO(data) sections = itertools.groupby(itertools.ifilter(lambda line: len(line) 1, fh), lambda line: group(line)) for key, section in sections: for line in section: print key, line, -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Perl and Python, a practical side-by-side example.
On Mar 2, 2:44 pm, Shawn Milo [EMAIL PROTECTED] wrote: (snipped) I'm attaching both the Perl and Python versions, and I'm open to comments on either. The script reads a file from standard input and finds the best record for each unique ID (piid). The best is defined as follows: The newest expiration date (field 5) for the record with the state (field 1) which matches the desired state (field 6). If there is no record matching the desired state, then just take the newest expiration date. Thanks for taking the time to look at these. My attempts: ### Perl ### #!/usr/bin/perl use strict; use warnings; use List::Util qw/reduce/; use constant { STATE = 1, DATE = 6, TARGET = 5, }; sub keep_best { my ($best, $current) = @_; if ($current-[STATE] eq $current-[TARGET]) { if ($best-[STATE] eq $best-[TARGET]) { if ($current-[DATE] gt $best-[DATE]) { return 0; } } else { return 0; } } elsif ( $best-[STATE] ne $best-[TARGET] and $current-[DATE] gt $best-[DATE]) { return 0; } return 1; } my %input; # while uses less memory than for: # the former is an iterator while () { chomp; my @results = split(/\t/, $_); my $key = $results[0]; push @{$input{$key}}, [ @results, $_ ]; } # while uses less memory than for: # the former is an iterator while (my ($key, $aref ) = each %input) { my $best = reduce { keep_best( $a, $b ) ? $a : $b } @$aref; print $best-[-1], \n; } ### Python (re-working John's code) ### import sys def keep_best(best, current): ACTUAL_STATE = 1 # John had these swapped DESIRED_STATE = 5 EXPIRY_DATE = 6 keep = True if current[ACTUAL_STATE] == current[DESIRED_STATE]: if best[ACTUAL_STATE] == best[DESIRED_STATE]: if current[EXPIRY_DATE] best[EXPIRY_DATE]: keep = False else: keep = False else: if (best[ACTUAL_STATE] != best[ACTUAL_STATE] and current[EXPIRY_DATE] best[EXPIRY_DATE]): keep = False return keep def process_file(opened_file=sys.stdin): PIID = 0 recs = {} for line in opened_file: line = line.rstrip('\n') row = line.split('\t') row.append(line) piid = row[PIID] if piid not in recs: recs[piid] = [] recs[piid].append(row) for piid in recs: best = reduce(lambda b, c: keep_best(b, c) and b or c, recs[piid]) print best[-1] if __name__ == __main__: process_file() # reduce seems to be Lispish, Pythonic, and Perlish! -- Hope this helps, Steve -- http://mail.python.org/mailman/listinfo/python-list
Re: Matplotlib axes label
On Mar 2, 7:02 am, John Henry [EMAIL PROTECTED] wrote: On Mar 1, 10:07 pm, John Henry [EMAIL PROTECTED] wrote: On Mar 1, 9:53 pm, [EMAIL PROTECTED] wrote: (snipped) You can try adjusting the labels and ticks using matplotlib.ticker. To the example you cited, one can add from matplotlib.ticker import MultipleLocator, FormatStrFormatter # ... minorLocator = MultipleLocator(0.1) minorFormattor = FormatStrFormatter('%0.1f') ax.yaxis.set_minor_locator(minorLocator) ax.yaxis.set_minor_formatter(minorFormattor) show() Thank you for the response. Yes, adding those lines did work. But what exactly is going on here? Why would adding these two lines works? Thanks, Okay, I played with the ticker formater and locator routines. Unfortunately, it doesn't help. The locator sets the major value and the formatter determines how the axes label is formatted. It doesn't gurantee that the first label starts at the origin. Half of my plots works, and half of them doesn't. As default, matplotlib places labels and tick marks at major ticks. Minor ticks are invisible as a default. The lines that I added turned on *minor* ticks and their labels; I set them to appear at integer multiples of 0.1 and I formatted them as floating point numbers. There's nothing to prevent you from having minor ticks appear at intervals that exceed those of major ticks. E.g., minorLocator = MultipleLocator(1.1) # etc. -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Matplotlib axes label
On Mar 1, 3:10 pm, John Henry [EMAIL PROTECTED] wrote: I've been asking this question at the matplotlib user list and never gotten an answer. I am hoping that there are matplotlib users here that can help. My problem with matplotlib's way of handling axes label is illustrated by this example: http://www.scipy.org/Cookbook/Matplotlib/MulticoloredLine Notice that the y-axis goes from (-1.1, 1.1) but the first label is at -1.0. (snipped) Is there a way to force the label to start at -1.1 instead of -1.0? Thanks, You can try adjusting the labels and ticks using matplotlib.ticker. To the example you cited, one can add from matplotlib.ticker import MultipleLocator, FormatStrFormatter # ... minorLocator = MultipleLocator(0.1) minorFormattor = FormatStrFormatter('%0.1f') ax.yaxis.set_minor_locator(minorLocator) ax.yaxis.set_minor_formatter(minorFormattor) show() -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Extract String From Enclosing Tuple
On Feb 28, 12:40 pm, [EMAIL PROTECTED] wrote: I'm a bit embarrassed to have to ask for help on this, but I'm not finding the solution in the docs I have here. Data are assembled for writing to a database table. A representative tuple looks like this: ('eco', (u'Roads',), 0.073969887301348305) Pysqlite doesn't like the format of the middle term: pysqlite2.dbapi2.InterfaceError: Error binding parameter 1 - probably unsupported type. I want to extract the 'Roads', part from the double-quoted enclosing tuple. (snipped) Perhaps something like: t = ('eco', (u'Roads',), 0.073969887301348305) t2 = eval(t[1], { '__builtins__' : {} }, {} ) t2 (u'Roads',) t2[0].encode('ascii') 'Roads' import itertools tuple(itertools.chain((t[0], t2[0].encode('ascii')), t[2:])) ('eco', 'Roads', 0.073969887301348305) tuple(itertools.chain((t[0], (t2[0].encode('ascii'),)), t[2:])) ('eco', ('Roads',), 0.073969887301348305) -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: text wrapping help
On Feb 28, 4:06 pm, Ryan K [EMAIL PROTECTED] wrote: I'm trying to text wrap a string but not using the textwrap module. I have 24x9 matrix and the string needs to be text wrapped according to those dimensions. Is there a known algorithm for this? Maybe some kind of regular expression? I'm having difficulty programming the algorithm. Try: import re sample_text = Personal firewall software may warn about the connection IDLE makes to its subprocess using this computer's internal loopback interface. This connection is not visible on any external interface and no data is sent to or received from the Internet. # assume 24 is sufficiently wide: lines = map(lambda x: x.rstrip(), re.findall(r'.{1,24}(?:(?=\S)\s|$)', sample_text.replace(\n, ))) print \n.join(lines) -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: text wrapping help
On Feb 28, 5:50 pm, Ryan K [EMAIL PROTECTED] wrote: On Feb 28, 8:27 pm, [EMAIL PROTECTED] wrote: Try: import re sample_text = Personal firewall software may warn about the connection IDLE makes to its subprocess using this computer's internal loopback interface. This connection is not visible on any external interface and no data is sent to or received from the Internet. # assume 24 is sufficiently wide: lines = map(lambda x: x.rstrip(), re.findall(r'.{1,24}(?:(?=\S)\s|$)', sample_text.replace(\n, ))) print \n.join(lines) -- Hope this helps, Steven That works great but I need to replace the newlines with 24-(the index of the \n) spaces. Just left-justify to the appropriate width with the the padding character you wanted: equally_long_lines = map(lambda x: x.ljust(24, ' '), lines) print \n.join(equally_long_lines) -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: classobj?
On Feb 26, 5:43 pm, Venky [EMAIL PROTECTED] wrote: Hi, I am trying to create classes at runtime based on input from a textfile. I am trying to use the function new.classobj. I am able to create the new classes successfully, however I fail to understand on how to add this new class to the current dictionary. cl = new.classobj('SomeClass', (BaseClass, ), {}) After this call, how do I instantiate SomeClass? I understand cl() will instantiate this, however this defeats my purpose, since the name of the class is obtained at runtime. Do you mean that you want to add it to globals()? globals()['SomeClass'] = cl myinst = SomeClass() print isinstance(myinst, SomeClass) print isinstance(myinst, BaseClass) -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: modifying a list while iterating through
On Feb 25, 5:12 pm, [EMAIL PROTECTED] wrote: consider the following working loop where Packet is a subclass of list, with Packet.insert(index, iterable) inserting each item in iterable into Packet at consecutive indexes starting at index. i=0 while(ilen(packet)-4): if packet[i:i+5]==Packet(01110): packet.insert(i, 0) i+=10 #skip the 5 bits inserted, and skip the 5 bits just checked bc overlap should not trigger insertion else: i+=1 is there a way to do this more elegantly? seems like a big kludge. If Packet consists of '0's and '1's, then it may be easier to convert to, or base the class on str (strings): packet = 101010011100111010001 print BEFORE , packet li = packet.split(01110) packet = 011100.join(li) print AFTER , packet -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Bug in time module - %z works in perl, not in python?
On Feb 21, 6:17 pm, [EMAIL PROTECTED] wrote: Following python code prints out incorrect UTC Offset - the python docs say that %z is not fully supported on all platforms - but on Linux Fedora FC5, perl code works and python does not - is this a bug or is this expected behavior? For a EST timezone setup, Perl prints correct -0500, while Python prints + - this is Python 2.4. Perl: $now_string = strftime %Y-%m-%d %H:%M:%S %Z%z, localtime; print $now_string, (iso local)\n; 2007-02-21 21:16:16 EST-0500 (iso localtime, perl) Python: now_string = time.strftime(%Y-%m-%d %H:%M:%S %Z%z, time.localtime()) print now_string, (iso localtime, python) 2007-02-21 21:15:58 EST+ (iso localtime, python) Is this expected behavior, or a bug? Seems to be a bug. I can duplicate the problem here (Python 2.4.3, Red Hat Desktop release 4). I do see the correct output, however, if I pass just the format string to strftime: print time.strftime(%Y-%m-%d %H:%M:%S %Z %z) 2007-02-21 18:42:03 PST -0800 print time.strftime(%Y-%m-%d %H:%M:%S %Z %z, time.localtime()) 2007-02-21 18:42:11 PST + -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: how to compare...
On Feb 12, 8:03 pm, jairodsl [EMAIL PROTECTED] wrote: Hello everybody ! I have two list, they are, S1=['A','B','C','D','E'], and S2=['F','G','H','I','J'], but i have to compare both in this way: A vs J A vs I, B vs J A vs H, B vs I, C vs J A vs G, B vs H, C vs I, D vs J A vs F, B vs G, C vs H, D vs I, E vs J B vs F, C vs G, D vs H, E vs I C vs F, D vs G, E vs H D vs F, E vs G E vs F (snipped) Could someone give me any idea how to compare(or print) both list in this way ??? Thanks a lot !!! jDSL s1 = [ 'A', 'B', 'C', 'D', 'E' ] s2 = [ 'F', 'G', 'H', 'I', 'J' ] s3 = [] for count in xrange( len(s1) + len(s2) - 1 ): try: operand = s2.pop() except IndexError: operand = None except: raise s3.insert(0,operand) print [ t for t in zip(s1, s3) if t[1] is not None ] -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: How to find all the same words in a text?
On Feb 11, 5:13 am, Samuel Karl Peterson [EMAIL PROTECTED] wrote: Johny [EMAIL PROTECTED] on 10 Feb 2007 05:29:23 -0800 didst step forth and proclaim thus: I need to find all the same words in a text . What would be the best idea to do that? I make no claims of this being the best approach: def findOccurances(a_string, word): Given a string and a word, returns a double: [0] = count [1] = list of indexes where word occurs import re count = 0 indexes = [] start = 0 # offset for successive passes pattern = re.compile(r'\b%s\b' % word, re.I) while True: match = pattern.search(a_string) if not match: break count += 1; indexes.append(match.start() + start) start += match.end() a_string = a_string[match.end():] return (count, indexes) Seems to work for me. No guarantees. More concisely: import re pattern = re.compile(r'\b324\b') indices = [ match.start() for match in pattern.finditer(target_string) ] print Indices, indices print Count: , len(indices) -- Cheers, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Strings in Python
On Feb 8, 8:28 am, Johny [EMAIL PROTECTED] wrote: Playing a little more with strings, I found out that string.find function provides the position of the first occurance of the substring in the string. Is there a way how to find out all substring's position ? To explain more, let's suppose mystring='12341' import string string.find(mystring ,'1') 0 But I need to find the possition the other '1' in mystring too. Is it possible? Or must I use regex? In this case, you can use: mystring = '12341' indices = [ _ for _ in range(len(mystring)) if mystring[_] == '1' ] print indices -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: Lists of lists and tuples, and finding things within them
Daniel Nogradi wrote: I have a program that keeps some of its data in a list of tuples. Sometimes, I want to be able to find that data out of the list. Here is the list in question: [('password01', 'unk'), ('host', 'dragonstone.org'), ('port', '1234'), ('character01', 'Thessalus')] For a regular list, I could do something like x.index('host') and find the index of it, but I don't know how to do this for a tuple where the data item isn't known in advance. For example, I want to get the host entry from the list above; but I can only retrieve it if I know what it contains (e.g., x.index(('host', 'dragonstone.org'))). Is there a better way to do this than a construct similar the following? for key, value in x: if key == 'host': print value If I were you I would use a dictionary for such a thing: (snipped) The sequence of tuples may have repeated keys; if that's the case, then you may use a filter/iterator instead. Using a dictionary would otherwise cause you to lose values: import itertools mytuple = (('foo', 'bar'), ('foo', 'foobar'), ('baz', 'qux')) it = itertools.ifilter(lambda t : t[0] == 'foo', mytuple) for t in it: print t -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: re question
Schüle Daniel wrote: (snipped) I am trying to construct a case where a greedy and non greedy operation produce different result. I dont see the difference between 'a??b' and 'a?b' As far I understand is that ? will first try to match a (it's greedy) and only if it fails then it step back and lets a unmatched. The other doesn't match a at first, only if the pattern fails to match it steps back and match a. But don't they do eventually the same thing? Can someone provide an example where 2 patterns yield different results. Perhaps this sheds some light on the matter: import re string = aaaba one = re.findall(r'a?b?', string) two = re.findall(r'a??b?', string) print one, two Yields: ['a', 'a', 'ab', 'a', ''] ['', '', '', 'b', '', ''] -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list
Re: subprocess cwd keyword.
Ivan Vinogradov wrote: Dear All, I would greatly appreciate a nudge in the right direction concerning the use of cwd argument in the call function from subprocess module. The setup is as follows: driver.py - python script core/ - directory main- fortran executable in the core directory driver script generates some input files in the core directory. Main should do its thing and dump the output files back into core. The problem is, I can't figure out how to do this properly. call(core/main) works but uses .. of core for input/output. call(core/main,cwd=core) and call(main,cwd=core) both result in File driver.py, line 47, in module main() File driver.py, line 40, in main print OUT, call(core/main, cwd=core) File /Library/Frameworks/Python.framework/Versions/2.5/lib/ python2.5/subprocess.py, line 443, in call return Popen(*popenargs, **kwargs).wait() File /Library/Frameworks/Python.framework/Versions/2.5/lib/ python2.5/subprocess.py, line 593, in __init__ errread, errwrite) File /Library/Frameworks/Python.framework/Versions/2.5/lib/ python2.5/subprocess.py, line 1051, in _execute_child raise child_exception OSError: [Errno 2] No such file or directory perhaps if subprocess would indicate the abs path of the object in question I could figure it out, but as is I'm lost. Perhaps you're looking for os.path.abspath? import subprocess import os subdir = os.path.join(*[ os.path.dirname(os.path.abspath(__file__)), core ]) print subdir try: retcode = subprocess.call([./main], cwd=subdir) except: raise print retcode -- Hope this helps, Steven -- http://mail.python.org/mailman/listinfo/python-list