Package Bio :: Module File
[hide private]
[frames] | no frames]

Source Code for Module Bio.File

  1  # Copyright 1999 by Jeffrey Chang.  All rights reserved. 
  2  # This code is part of the Biopython distribution and governed by its 
  3  # license.  Please see the LICENSE file that should have been included 
  4  # as part of this package. 
  5   
  6  """Code for more fancy file handles. 
  7   
  8   
  9  Classes: 
 10   
 11  UndoHandle     File object decorator with support for undo-like operations. 
 12   
 13  StringHandle   Wraps a file object around a string. 
 14   
 15  SGMLStripper   Object that strips SGML.  This is now considered OBSOLETE, and 
 16                 is likely to be deprecated in a future release of Biopython, 
 17                 and later removed. 
 18   
 19  """ 
 20  import StringIO 
 21   
22 -class UndoHandle:
23 """A Python handle that adds functionality for saving lines. 24 25 Saves lines in a LIFO fashion. 26 27 Added methods: 28 saveline Save a line to be returned next time. 29 peekline Peek at the next line without consuming it. 30 31 """
32 - def __init__(self, handle):
33 self._handle = handle 34 self._saved = []
35
36 - def __iter__(self):
37 return self
38
39 - def next(self):
40 next = self.readline() 41 if not next: 42 raise StopIteration 43 return next
44
45 - def readlines(self, *args, **keywds):
46 lines = self._saved + self._handle.readlines(*args,**keywds) 47 self._saved = [] 48 return lines
49
50 - def readline(self, *args, **keywds):
51 if self._saved: 52 line = self._saved.pop(0) 53 else: 54 line = self._handle.readline(*args,**keywds) 55 return line
56
57 - def read(self, size=-1):
58 if size == -1: 59 saved = "".join(self._saved) 60 self._saved[:] = [] 61 else: 62 saved = '' 63 while size > 0 and self._saved: 64 if len(self._saved[0]) <= size: 65 size = size - len(self._saved[0]) 66 saved = saved + self._saved.pop(0) 67 else: 68 saved = saved + self._saved[0][:size] 69 self._saved[0] = self._saved[0][size:] 70 size = 0 71 return saved + self._handle.read(size)
72
73 - def saveline(self, line):
74 if line: 75 self._saved = [line] + self._saved
76
77 - def peekline(self):
78 if self._saved: 79 line = self._saved[0] 80 else: 81 line = self._handle.readline() 82 self.saveline(line) 83 return line
84
85 - def tell(self):
86 lengths = map(len, self._saved) 87 sum = reduce(lambda x, y: x+y, lengths, 0) 88 return self._handle.tell() - sum
89
90 - def seek(self, *args):
91 self._saved = [] 92 self._handle.seek(*args)
93
94 - def __getattr__(self, attr):
95 return getattr(self._handle, attr)
96
97 - def __enter__(self):
98 return self
99
100 - def __exit__(self, type, value, traceback):
101 self._handle.close()
102 103 104 # I could make this faster by using cStringIO. 105 # However, cStringIO (in v1.52) does not implement the 106 # readlines method. 107 StringHandle = StringIO.StringIO 108 109 try: 110 import sgmllib 111 except ImportError: 112 #This isn't available on Python 3, but we don't care much as SGMLStripper 113 #is obsolete 114 pass 115 else:
116 - class SGMLStripper:
117 """Object to strip SGML tags (OBSOLETE)."""
118 - class MyParser(sgmllib.SGMLParser):
119 - def __init__(self):
120 sgmllib.SGMLParser.__init__(self) 121 self.data = ''
122 - def handle_data(self, data):
123 self.data = self.data + data
124
125 - def __init__(self):
126 import warnings 127 warnings.warn("This class is obsolete, and likely to be deprecated and later removed in a future version of Biopython", PendingDeprecationWarning) 128 self._parser = SGMLStripper.MyParser()
129
130 - def strip(self, str):
131 """S.strip(str) -> string 132 133 Strip the SGML tags from str. 134 135 """ 136 if not str: # empty string, don't do anything. 137 return '' 138 # I need to make sure that I don't return an empty string if 139 # the buffer is not empty. This can happen if there's a newline 140 # character embedded within a tag. Thus, I'll first check to 141 # see if the last character is a newline. If it is, and it's stripped 142 # away, I'll add it back. 143 is_newline = str[-1] in ['\n', '\r'] 144 145 self._parser.data = '' # clear the parser's data (don't reset) 146 self._parser.feed(str) 147 if self._parser.data: 148 str = self._parser.data 149 elif is_newline: 150 str = '\n' 151 else: 152 str = '' 153 return str
154