prasad rao wrote:
hello
    I wanted to prevent other users of my computers to read my files.
So tried to creat a module to achieve it.
I used a flag to deside which methods to be called on the object.
somehow it is not working.I realise after 2 days of struggle that
as  it is usuel , I am blind to my faults.
I tested all the metheds except main() in idle interactively,found them
working.
So there is a bug in the main(), kan anyone point it out to me?

<code>


#! usr/bin/env python

import ast,random,os,zlib,string
key=5
class Cripto(object):
    def __init__(self,afile):
        self.afile=afile
    def __digi(self,astring):
        y=[]
        for x in astring:
            y.append(ord(x))
        y=str(y)

        return y
    def __undigi(self,astring):

        alist=ast.literal_eval(astring)
        y=[]
        for x in alist:
            y.append(chr(x))
        astring=''.join(y)
        return astring
    def __gen_string(self):
        s=''
 nl=random.sample(string.ascii_letters,key)
 for x in nl:s+=x
 return s

    def __lengthen(self,astring):
         s=list(astring)
  ns=''
  for x in s:
  ns+=x
  ns+=gen_string()
  return ns
    def __shorten(self,astring):

         s=list(astring)
  ns=''
  for x in range(0,len(s),key+1):
  ns+=s[x]
  return ns
    def __compress(self,astring):
        astring=zlib.compress(astring)
        return astring
    def __decompress(self,astring):
        astring=zlib.decompress(astring)
        return astring
    def main(self):
        sorce=open(self.afile,'r')
        data=(sorce.readlines())
        dest=open ((os.path.split(self.afile)[0]+os.sep+'temp'),'w')
        if data[:1]=='flag1\n':
            ns='flag0\n'
            data=data[1:]
            for line in data:
               nl=__compress((__digi(__lengthen(line.strip()))))+'\n'
               ns+=nl
            dest.write(ns)
        elif data[:1]=='flag0\n':
            ns='flag1\n'
            data=data[1:]
            for line in data:
                nl=__decompress((__undigi(__shorten(line.strip()))))+'\n'
                ns+=nl
            dest.write(ns)

        sorce.close()
        dest.close()

        os.remove(self.afile)
        os.rename((os.path.split(self.afile)[0]+os.sep+'temp'),self.afile)


#========
a=Cripto('C:/pp.txt')
a.main()


<\code>

First problem is the indentation. It won't compile as it is. I'll assume that was somehow a pasting error.

Next problem is where you're comparing for 'flag1' Your line if data[:1] == 'flag1\n' is comparing a list on the left side to a string on the right. If it were me, I'd replace that test, and the similar one below it, with
       if data[0].rstrip()=='flag1':


The reason for the rstrip() is to make it easier for a test harness, where it may be a pain to get the newlines on each line. Also, it's harder to spot a whitespace error.

Next problem/question is whether this is only going to be used for files that happen to begin with a line flag1. If so, it should be documented as part of the code, along with all the other missing documentation/docstrings.


That's as far as I went; I did not test the actual encoding logic But some free advice for next time: When you ask a question, please supply a compilable program, and either test data, or enough description that we can build such. And please tell us what the symptom is.

"it is not working."  is not very descriptive.


DaveA
_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to