Dave Kuhlman <dkuhl...@rexx.com> dixit:

> On Fri, Dec 04, 2009 at 01:13:42PM +0530, Prasad Mehendale wrote:
> > I am a beginner. I want to save the output data of the following programme 
> > in 
> > a file through the programme. Please suggest me the way. I am using Python 
> > 2.3.3 on mandrake linux 10 and using "Idle" to save the output to a file 
> > presently. 
> > Thanks in advance.
> > 
> > #programme to calculate various parameters for a dc-generator.
> > import math
> > #import os
> > #flux is assumed to be .005Wb, and A=parallel paths = 2 for wave winding
> > polerpm=[]
> > for ConductorsPerSlot in range(1,11):
> >     """ we consider that output voltage is 20 V DC """
> >     PoleRpmProduct=20000/ConductorsPerSlot
> >     polerpm.append(PoleRpmProduct)
> > print '(Pole*RPM) product for various values of conductors/slot is: \n', 
> > polerpm
> > for poles in range(2,18,2):
> >     print
> >     print '\n For number of poles='+str(poles) +'  RPM values are: '
> >     for i in range(len(polerpm)):
> >                    rpm=polerpm[i]/poles
> >                    print rpm,
> > 
> > 
> 
> Another suggestion is to define a class that contains a method
> named "write" which takes one argument which is the text to be
> printed.
> 
> This approach is useful when there are print statements in code
> that is not under your control, for example imported modules.
> 
> There is a note about this here:
> 
>     http://docs.python.org/library/sys.html#sys.stdout
> 
> Here is an example:
> 
> # ================================================
> import sys
> 
> class Redirect(object):
>     def __init__(self, filename):
>         self.outfile = open(filename, 'w')
>         self.count = 0
>     def write(self, msg):
>         self.count += 1
>         self.outfile.write('%d %s\n' % (self.count, msg, ))
>     def close(self):
>         self.outfile.close()
> 
> def test():
>     print 'starting'
>     save_stdout = sys.stdout
>     redir = Redirect('/tmp/tmp1.txt')
>     sys.stdout = redir
>     print 'something'
>     print 'something else'
>     redir.close()
>     sys.stdout = save_stdout
>     print 'finished'
> 
> test()
> # ================================================

Hello,
Thank you Dave for your class, sure I will use it often.

-1- print & sys.stdout.write()
Just discovered that
   print(text)
is not equivalent to 
   sys.stdout.write(text+'\n')
but to
   sys.stdout.write(text)
   sys.stdout.write('\n')

As shown below due to line numbers. I just added a debug output to (original 
sys.stdout I call) console.

================
# change
class Redirect(object):
        def __init__(self, filename):
                self.console = sys.stdout
                self.outfile = open(filename, 'w')
                self.count = 0
        def write(self, msg):
                self.count += 1
                self.outfile.write('%d %s\n' % (self.count, msg, ))
                self.console.write('%d %s\n' % (self.count, msg, ))
        def close(self):
                self.outfile.close()
# ==>
Hello 
starting
1 something
2 

3 something else
4 

finished
=======================

I find this behaviour rather annoying. Requires an ugly trick to workaround.

-2- file subtype
Is there a reason why you don't make Redirect directly (lol) a subtype of file?
Actually I just tried it and got an error "bad file descriptor":

# this is my new stdout:
<open file '/tmp/tmp1.txt', mode 'r' at 0xb787dc8c>

# when trying to print:
  File "__essai__.py", line 74, in <module>
    test()
  File "__essai__.py", line 68, in test
    print 'something'
IOError: [Errno 9] Bad file descriptor

Below code of new class.

Denis


class Out(file):
        def __init__(self, filename, toconsole=True, numberlines=True):
                file.__init__(self, filename, 'r')
                print self
                # debug output to console
                self.toconsole = toconsole
                # line numbering
                self.numberlines = numberlines
                if self.numberlines:
                        self.linenumber = 0
                # save default stdout
                self.console = sys.stdout
        def write(self, msg):
                if self.numberlines:
                        self.linenumber += 1
                        linenumber = "%3d       " % self.linenumber
                else:
                        linenumber = ""
                text = "%s%s\n" %(linenumber, msg)
                self.write(text)
                if self.toconsole:
                        self.console.write(text)
        def close(self):
                # restore default stdout
                sys.stdout = self.console
                # close file
                self.close()



Denis
________________________________

la vita e estrany

http://spir.wikidot.com/
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to