import string
import Numeric
def AsciiMatrixReader(filename, read_dictio=0):

   """
   "
   def function_name(filename, read_dictio=0):
      
      reads a file containing an ascii matrix.
      Carriage return split lines
      EXAMPLE (MLAB):
         
         a=MLab.AsciiReader("toto.txt")


      The file can contain comments in this form
      #   key = value
      They are normally skipped, but you can read them
      setting read_dictio=1 in the arguments

      
         "
   """  

   f=open(filename,"r")
   datas=f.read()
   datalines=string.split(datas,"\n")
   
   header=[]
   newdata=[]
   for l in datalines :
      if(l[0]=="#"):
         header.append(l)
      else:
         newdata.append(l)

   datalines=newdata

   Np=len(datalines)

   data=map(string.split,datalines)

   dim=len(data[0])
   for i in range(Np):
     data[i]=map(string.atof,data[i])

   newdata=[]
   for i in range(Np):
     if(len(data[i])==dim):
         newdata.append(data[i])
   data=Numeric.array(newdata)


   if(read_dictio==0):
      return data
   else:
      dic={}
      for l in header:
         l=l[1:]
         l=string.strip(l)
         exec(l, globals(),dic)
         
      return data, dic

def AsciiMatrixWriter(A, filename, format="%s", dic=None):
       """
	def function_name(A,filename, format="%s", dic=None):
	 - A is a numPy matrix
         - if a dictionary is passed as dic,
           it is written as # initiated comments
	 write a matrix in ascii format a file containing an ascii matrix.
         Carriage return split lines

	 The format argument, if specified, will be used 
           in this context ( writing to file) :
                f.fwrite( format % token  )
             
	EXAMPLE (MLAB):


import Numeric
import math
A=Numeric.arrayrange(0,10,math.sqrt(2.0))
MLab.AsciiWriter(A,"toto.txt", "%10.10e")
B=MLab.AsciiReader("toto.txt")
print B -A    


       """
       f=open(filename,"w")
       if(dic is not None):
         for key in dic.keys():
             f.write("# %s = %s\n" %(key, repr(dic[key])) ) 
       
       if(len(A.shape)==1):
          for tok in A:
             f.write(format % tok)
             f.write(" ")
          f.close()
       elif(    len(A.shape)==2):
          for Al in A:
             for tok in Al:
                f.write(format % tok)
                f.write(" ")
             f.write("\n")
          f.close()
       else:
          raise "  wrong shape for object A in routine AsciiMatrixWriter"

 


