1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 """A wrapper for cStringIO that provides more of the functions of StringIO at the speed of cStringIO"""
23
24 import cStringIO
25
28 if not isinstance(buf, (str, unicode)):
29 buf = str(buf)
30 if isinstance(buf, unicode):
31 buf = buf.encode('utf-8')
32 self.len = len(buf)
33 self.buf = cStringIO.StringIO()
34 self.buf.write(buf)
35 self.buf.seek(0)
36 self.pos = 0
37 self.closed = 0
38
41
43 if self.closed:
44 raise StopIteration
45 r = self.readline()
46 if not r:
47 raise StopIteration
48 return r
49
51 """Free the memory buffer.
52 """
53 if not self.closed:
54 self.closed = 1
55 del self.buf, self.pos
56
58 if self.closed:
59 raise ValueError, "I/O operation on closed file"
60 return False
61
62 - def seek(self, pos, mode = 0):
63 if self.closed:
64 raise ValueError, "I/O operation on closed file"
65 self.buf.seek(pos, mode)
66 self.pos = self.buf.tell()
67
69 if self.closed:
70 raise ValueError, "I/O operation on closed file"
71 return self.pos
72
73 - def read(self, n = None):
74 if self.closed:
75 raise ValueError, "I/O operation on closed file"
76 if n == None:
77 r = self.buf.read()
78 else:
79 r = self.buf.read(n)
80 self.pos = self.buf.tell()
81 return r
82
84 if self.closed:
85 raise ValueError, "I/O operation on closed file"
86 if length is not None:
87 r = self.buf.readline(length)
88 else:
89 r = self.buf.readline()
90 self.pos = self.buf.tell()
91 return r
92
94 if self.closed:
95 raise ValueError, "I/O operation on closed file"
96 lines = self.buf.readlines()
97 self.pos = self.buf.tell()
98 return lines
99
101 if self.closed:
102 raise ValueError, "I/O operation on closed file"
103 self.buf.truncate(size)
104 self.pos = self.buf.tell()
105 self.buf.seek(0, 2)
106 self.len = self.buf.tell()
107 self.buf.seek(self.pos)
108
110 if self.closed:
111 raise ValueError, "I/O operation on closed file"
112 origpos = self.buf.tell()
113 self.buf.write(s)
114 self.pos = self.buf.tell()
115 if origpos + len(s) > self.len:
116 self.buf.seek(0, 2)
117 self.len = self.buf.tell()
118 self.buf.seek(self.pos)
119
121 if self.closed:
122 raise ValueError, "I/O operation on closed file"
123 self.buf.writelines(lines)
124 self.pos = self.buf.tell()
125 self.buf.seek(0, 2)
126 self.len = self.buf.tell()
127 self.buf.seek(self.pos)
128
130 if self.closed:
131 raise ValueError, "I/O operation on closed file"
132 self.buf.flush()
133
135 if self.closed:
136 raise ValueError, "I/O operation on closed file"
137 return self.buf.getvalue()
138
140 """catches the output before it is closed and sends it to an onclose method"""
142 """Set up the output stream, and remember a method to call on closing"""
143 StringIO.__init__(self)
144 self.onclose = onclose
145
151
153 """use this method to force the closing of the stream if it isn't closed yet"""
154 if not self.closed:
155 self.close()
156