3838
3939class StringIO :
4040 def __init__ (self , buf = '' ):
41- self .buf = buf
42- self .len = len (buf )
43- self .buflist = []
44- self .pos = 0
45- self .closed = 0
46- self .softspace = 0
41+ self .buf = buf
42+ self .len = len (buf )
43+ self .buflist = []
44+ self .pos = 0
45+ self .closed = 0
46+ self .softspace = 0
4747
4848 def close (self ):
49- if not self .closed :
50- self .closed = 1
51- del self .buf , self .pos
49+ if not self .closed :
50+ self .closed = 1
51+ del self .buf , self .pos
5252
5353 def isatty (self ):
54- if self .closed :
55- raise ValueError , "I/O operation on closed file"
56- return 0
54+ if self .closed :
55+ raise ValueError , "I/O operation on closed file"
56+ return 0
5757
5858 def seek (self , pos , mode = 0 ):
59- if self .closed :
60- raise ValueError , "I/O operation on closed file"
61- if self .buflist :
62- self .buf += EMPTYSTRING .join (self .buflist )
63- self .buflist = []
64- if mode == 1 :
65- pos += self .pos
66- elif mode == 2 :
67- pos += self .len
68- self .pos = max (0 , pos )
59+ if self .closed :
60+ raise ValueError , "I/O operation on closed file"
61+ if self .buflist :
62+ self .buf += EMPTYSTRING .join (self .buflist )
63+ self .buflist = []
64+ if mode == 1 :
65+ pos += self .pos
66+ elif mode == 2 :
67+ pos += self .len
68+ self .pos = max (0 , pos )
6969
7070 def tell (self ):
71- if self .closed :
72- raise ValueError , "I/O operation on closed file"
73- return self .pos
71+ if self .closed :
72+ raise ValueError , "I/O operation on closed file"
73+ return self .pos
7474
7575 def read (self , n = - 1 ):
76- if self .closed :
77- raise ValueError , "I/O operation on closed file"
78- if self .buflist :
79- self .buf += EMPTYSTRING .join (self .buflist )
80- self .buflist = []
81- if n < 0 :
82- newpos = self .len
83- else :
84- newpos = min (self .pos + n , self .len )
85- r = self .buf [self .pos :newpos ]
86- self .pos = newpos
87- return r
76+ if self .closed :
77+ raise ValueError , "I/O operation on closed file"
78+ if self .buflist :
79+ self .buf += EMPTYSTRING .join (self .buflist )
80+ self .buflist = []
81+ if n < 0 :
82+ newpos = self .len
83+ else :
84+ newpos = min (self .pos + n , self .len )
85+ r = self .buf [self .pos :newpos ]
86+ self .pos = newpos
87+ return r
8888
8989 def readline (self , length = None ):
90- if self .closed :
91- raise ValueError , "I/O operation on closed file"
92- if self .buflist :
93- self .buf += EMPTYSTRING .join (self .buflist )
94- self .buflist = []
95- i = self .buf .find ('\n ' , self .pos )
96- if i < 0 :
97- newpos = self .len
98- else :
99- newpos = i + 1
100- if length is not None :
101- if self .pos + length < newpos :
102- newpos = self .pos + length
103- r = self .buf [self .pos :newpos ]
104- self .pos = newpos
105- return r
90+ if self .closed :
91+ raise ValueError , "I/O operation on closed file"
92+ if self .buflist :
93+ self .buf += EMPTYSTRING .join (self .buflist )
94+ self .buflist = []
95+ i = self .buf .find ('\n ' , self .pos )
96+ if i < 0 :
97+ newpos = self .len
98+ else :
99+ newpos = i + 1
100+ if length is not None :
101+ if self .pos + length < newpos :
102+ newpos = self .pos + length
103+ r = self .buf [self .pos :newpos ]
104+ self .pos = newpos
105+ return r
106106
107107 def readlines (self , sizehint = 0 ):
108- total = 0
109- lines = []
110- line = self .readline ()
111- while line :
112- lines .append (line )
113- total += len (line )
114- if 0 < sizehint <= total :
115- break
116- line = self .readline ()
117- return lines
108+ total = 0
109+ lines = []
110+ line = self .readline ()
111+ while line :
112+ lines .append (line )
113+ total += len (line )
114+ if 0 < sizehint <= total :
115+ break
116+ line = self .readline ()
117+ return lines
118118
119119 def truncate (self , size = None ):
120- if self .closed :
121- raise ValueError , "I/O operation on closed file"
122- if size is None :
123- size = self .pos
124- elif size < 0 :
125- raise IOError (EINVAL , "Negative size not allowed" )
126- elif size < self .pos :
127- self .pos = size
128- self .buf = self .getvalue ()[:size ]
120+ if self .closed :
121+ raise ValueError , "I/O operation on closed file"
122+ if size is None :
123+ size = self .pos
124+ elif size < 0 :
125+ raise IOError (EINVAL , "Negative size not allowed" )
126+ elif size < self .pos :
127+ self .pos = size
128+ self .buf = self .getvalue ()[:size ]
129129
130130 def write (self , s ):
131- if self .closed :
132- raise ValueError , "I/O operation on closed file"
133- if not s : return
134- if self .pos > self .len :
135- self .buflist .append ('\0 ' * (self .pos - self .len ))
136- self .len = self .pos
137- newpos = self .pos + len (s )
138- if self .pos < self .len :
139- if self .buflist :
140- self .buf += EMPTYSTRING .join (self .buflist )
141- self .buflist = []
142- self .buflist = [self .buf [:self .pos ], s , self .buf [newpos :]]
143- self .buf = ''
144- if newpos > self .len :
145- self .len = newpos
146- else :
147- self .buflist .append (s )
148- self .len = newpos
149- self .pos = newpos
131+ if self .closed :
132+ raise ValueError , "I/O operation on closed file"
133+ if not s : return
134+ if self .pos > self .len :
135+ self .buflist .append ('\0 ' * (self .pos - self .len ))
136+ self .len = self .pos
137+ newpos = self .pos + len (s )
138+ if self .pos < self .len :
139+ if self .buflist :
140+ self .buf += EMPTYSTRING .join (self .buflist )
141+ self .buflist = []
142+ self .buflist = [self .buf [:self .pos ], s , self .buf [newpos :]]
143+ self .buf = ''
144+ if newpos > self .len :
145+ self .len = newpos
146+ else :
147+ self .buflist .append (s )
148+ self .len = newpos
149+ self .pos = newpos
150150
151151 def writelines (self , list ):
152- self .write (EMPTYSTRING .join (list ))
152+ self .write (EMPTYSTRING .join (list ))
153153
154154 def flush (self ):
155- if self .closed :
156- raise ValueError , "I/O operation on closed file"
155+ if self .closed :
156+ raise ValueError , "I/O operation on closed file"
157157
158158 def getvalue (self ):
159- if self .buflist :
160- self .buf += EMPTYSTRING .join (self .buflist )
161- self .buflist = []
162- return self .buf
159+ if self .buflist :
160+ self .buf += EMPTYSTRING .join (self .buflist )
161+ self .buflist = []
162+ return self .buf
163163
164164
165165# A little test suite
166166
167167def test ():
168168 import sys
169169 if sys .argv [1 :]:
170- file = sys .argv [1 ]
170+ file = sys .argv [1 ]
171171 else :
172- file = '/etc/passwd'
172+ file = '/etc/passwd'
173173 lines = open (file , 'r' ).readlines ()
174174 text = open (file , 'r' ).read ()
175175 f = StringIO ()
176176 for line in lines [:- 2 ]:
177- f .write (line )
177+ f .write (line )
178178 f .writelines (lines [- 2 :])
179179 if f .getvalue () != text :
180- raise RuntimeError , 'write failed'
180+ raise RuntimeError , 'write failed'
181181 length = f .tell ()
182182 print 'File length =' , length
183183 f .seek (len (lines [0 ]))
@@ -190,18 +190,18 @@ def test():
190190 f .seek (- len (line ), 1 )
191191 line2 = f .read (len (line ))
192192 if line != line2 :
193- raise RuntimeError , 'bad result after seek back'
193+ raise RuntimeError , 'bad result after seek back'
194194 f .seek (len (line2 ), 1 )
195195 list = f .readlines ()
196196 line = list [- 1 ]
197197 f .seek (f .tell () - len (line ))
198198 line2 = f .read ()
199199 if line != line2 :
200- raise RuntimeError , 'bad result after seek back from EOF'
200+ raise RuntimeError , 'bad result after seek back from EOF'
201201 print 'Read' , len (list ), 'more lines'
202202 print 'File length =' , f .tell ()
203203 if f .tell () != length :
204- raise RuntimeError , 'bad length'
204+ raise RuntimeError , 'bad length'
205205 f .close ()
206206
207207if __name__ == '__main__' :
0 commit comments