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 DEPRECATED, and is likely 
 16                 to be removed in a future release of Biopython. 
 17   
 18  """ 
 19  import StringIO 
 20   
21 -class UndoHandle(object):
22 """A Python handle that adds functionality for saving lines. 23 24 Saves lines in a LIFO fashion. 25 26 Added methods: 27 saveline Save a line to be returned next time. 28 peekline Peek at the next line without consuming it. 29 30 """
31 - def __init__(self, handle):
32 self._handle = handle 33 self._saved = []
34
35 - def __iter__(self):
36 return self
37
38 - def next(self):
39 next = self.readline() 40 if not next: 41 raise StopIteration 42 return next
43
44 - def readlines(self, *args, **keywds):
45 lines = self._saved + self._handle.readlines(*args,**keywds) 46 self._saved = [] 47 return lines
48
49 - def readline(self, *args, **keywds):
50 if self._saved: 51 line = self._saved.pop(0) 52 else: 53 line = self._handle.readline(*args,**keywds) 54 return line
55
56 - def read(self, size=-1):
57 if size == -1: 58 saved = "".join(self._saved) 59 self._saved[:] = [] 60 else: 61 saved = '' 62 while size > 0 and self._saved: 63 if len(self._saved[0]) <= size: 64 size = size - len(self._saved[0]) 65 saved = saved + self._saved.pop(0) 66 else: 67 saved = saved + self._saved[0][:size] 68 self._saved[0] = self._saved[0][size:] 69 size = 0 70 return saved + self._handle.read(size)
71
72 - def saveline(self, line):
73 if line: 74 self._saved = [line] + self._saved
75
76 - def peekline(self):
77 if self._saved: 78 line = self._saved[0] 79 else: 80 line = self._handle.readline() 81 self.saveline(line) 82 return line
83
84 - def tell(self):
85 lengths = map(len, self._saved) 86 sum = reduce(lambda x, y: x+y, lengths, 0) 87 return self._handle.tell() - sum
88
89 - def seek(self, *args):
90 self._saved = [] 91 self._handle.seek(*args)
92
93 - def __getattr__(self, attr):
94 return getattr(self._handle, attr)
95
96 - def __enter__(self):
97 return self
98
99 - def __exit__(self, type, value, traceback):
100 self._handle.close()
101 102 103 # I could make this faster by using cStringIO. 104 # However, cStringIO (in v1.52) does not implement the 105 # readlines method. 106 StringHandle = StringIO.StringIO 107 108 try: 109 import sgmllib 110 except ImportError: 111 #This isn't available on Python 3, but we don't care much as SGMLStripper 112 #is obsolete 113 pass 114 else:
115 - class SGMLStripper(object):
116 """Object to strip SGML tags (OBSOLETE)."""
117 - class MyParser(sgmllib.SGMLParser):
118 - def __init__(self):
119 sgmllib.SGMLParser.__init__(self) 120 self.data = ''
121 - def handle_data(self, data):
122 self.data = self.data + data
123
124 - def __init__(self):
125 import warnings 126 import Bio 127 warnings.warn("This class is deprecated, and is likely to be removed in a future version of Biopython", Bio.BiopythonDeprecationWarning) 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