Vega strike Python Modules doc
0.5.1
Documentation of the " Modules " folder of Vega strike
Main Page
Namespaces
Data Structures
Files
File List
All
Data Structures
Namespaces
Files
Functions
Variables
StringIO.py
Go to the documentation of this file.
1
"""File-like objects that read from or write to a string buffer.
2
3
This implements (nearly) all stdio methods.
4
5
f = StringIO() # ready for writing
6
f = StringIO(buf) # ready for reading
7
f.close() # explicitly release resources held
8
flag = f.isatty() # always false
9
pos = f.tell() # get current position
10
f.seek(pos) # set current position
11
f.seek(pos, mode) # mode 0: absolute; 1: relative; 2: relative to EOF
12
buf = f.read() # read until EOF
13
buf = f.read(n) # read up to n bytes
14
buf = f.readline() # read until end of line ('\n') or EOF
15
list = f.readlines()# list of f.readline() results until EOF
16
f.truncate([size]) # truncate file at to at most size (default: current pos)
17
f.write(buf) # write at current position
18
f.writelines(list) # for line in list: f.write(line)
19
f.getvalue() # return whole file's contents as a string
20
21
Notes:
22
- Using a real file is often faster (but less convenient).
23
- There's also a much faster implementation in C, called cStringIO, but
24
it's not subclassable.
25
- fileno() is left unimplemented so that code which uses it triggers
26
an exception early.
27
- Seeking far beyond EOF and then writing will insert real null
28
bytes that occupy space in the buffer.
29
- There's a simple test set (see end of this file).
30
"""
31
import
types
32
try
:
33
from
errno
import
EINVAL
34
except
ImportError:
35
EINVAL = 22
36
37
__all__ = [
"StringIO"
]
38
39
class
StringIO
:
40
def
__init__
(self, buf = ''):
41
# Force self.buf to be a string or unicode
42
if
type(buf)
not
in
types.StringTypes:
43
buf =
str
(buf)
44
self.
buf
= buf
45
self.
len
=
len
(buf)
46
self.
buflist
= []
47
self.
pos
= 0
48
self.
closed
= 0
49
self.
softspace
= 0
50
51
def
__iter__
(self):
52
return
iter(self.
readline
,
''
)
53
54
def
close
(self):
55
if
not
self.
closed
:
56
self.
closed
= 1
57
del self.
buf
, self.
pos
58
59
def
isatty
(self):
60
if
self.
closed
:
61
raise
ValueError,
"I/O operation on closed file"
62
return
0
63
64
def
seek
(self, pos, mode = 0):
65
if
self.
closed
:
66
raise
ValueError,
"I/O operation on closed file"
67
if
self.
buflist
:
68
self.
buf
+=
''
.
join
(self.
buflist
)
69
self.
buflist
= []
70
if
mode == 1:
71
pos += self.
pos
72
elif
mode == 2:
73
pos += self.
len
74
self.
pos
=
max
(0, pos)
75
76
def
tell
(self):
77
if
self.
closed
:
78
raise
ValueError,
"I/O operation on closed file"
79
return
self.
pos
80
81
def
read
(self, n = -1):
82
if
self.
closed
:
83
raise
ValueError,
"I/O operation on closed file"
84
if
self.
buflist
:
85
self.
buf
+=
''
.
join
(self.
buflist
)
86
self.
buflist
= []
87
if
n < 0:
88
newpos = self.
len
89
else
:
90
newpos =
min
(self.
pos
+n, self.
len
)
91
r = self.
buf
[self.
pos
:newpos]
92
self.
pos
= newpos
93
return
r
94
95
def
readline
(self, length=None):
96
if
self.
closed
:
97
raise
ValueError,
"I/O operation on closed file"
98
if
self.
buflist
:
99
self.
buf
+=
''
.
join
(self.
buflist
)
100
self.
buflist
= []
101
i = self.buf.find(
'\n'
, self.
pos
)
102
if
i < 0:
103
newpos = self.
len
104
else
:
105
newpos = i+1
106
if
length
is
not
None
:
107
if
self.
pos
+ length < newpos:
108
newpos = self.
pos
+ length
109
r = self.
buf
[self.
pos
:newpos]
110
self.
pos
= newpos
111
return
r
112
113
def
readlines
(self, sizehint = 0):
114
total = 0
115
lines = []
116
line = self.
readline
()
117
while
line:
118
lines.append(line)
119
total +=
len
(line)
120
if
0 < sizehint <= total:
121
break
122
line = self.
readline
()
123
return
lines
124
125
def
truncate
(self, size=None):
126
if
self.
closed
:
127
raise
ValueError,
"I/O operation on closed file"
128
if
size
is
None
:
129
size = self.
pos
130
elif
size < 0:
131
raise
IOError(EINVAL,
"Negative size not allowed"
)
132
elif
size < self.
pos
:
133
self.
pos
= size
134
self.
buf
= self.
getvalue
()[:size]
135
136
def
write
(self, s):
137
if
self.
closed
:
138
raise
ValueError,
"I/O operation on closed file"
139
if
not
s:
return
140
# Force s to be a string or unicode
141
if
type(s)
not
in
types.StringTypes:
142
s =
str
(s)
143
if
self.
pos
> self.
len
:
144
self.buflist.append(
'\0'
*(self.
pos
- self.
len
))
145
self.
len
= self.
pos
146
newpos = self.
pos
+
len
(s)
147
if
self.
pos
< self.
len
:
148
if
self.
buflist
:
149
self.
buf
+=
''
.
join
(self.
buflist
)
150
self.
buflist
= []
151
self.
buflist
= [self.
buf
[:self.
pos
], s, self.
buf
[newpos:]]
152
self.
buf
=
''
153
if
newpos > self.
len
:
154
self.
len
= newpos
155
else
:
156
self.buflist.append(s)
157
self.
len
= newpos
158
self.
pos
= newpos
159
160
def
writelines
(self, list):
161
self.
write
(
''
.
join
(list))
162
163
def
flush
(self):
164
if
self.
closed
:
165
raise
ValueError,
"I/O operation on closed file"
166
167
def
getvalue
(self):
168
if
self.
buflist
:
169
self.
buf
+=
''
.
join
(self.
buflist
)
170
self.
buflist
= []
171
return
self.
buf
172
173
174
# A little test suite
175
176
def
test
():
177
import
sys
178
if
sys.argv[1:]:
179
file = sys.argv[1]
180
else
:
181
file =
'/etc/passwd'
182
lines =
open
(file,
'
r').readlines()
183
text =
open
(file,
'
r').read()
184
f =
StringIO
()
185
for
line
in
lines[:-2]:
186
f.write(line)
187
f.writelines(lines[-2:])
188
if
f.getvalue() != text:
189
raise
RuntimeError,
'write failed'
190
length = f.tell()
191
print
'File length ='
, length
192
f.seek(len(lines[0]))
193
f.write(lines[1])
194
f.seek(0)
195
print
'First line ='
, `f.readline()`
196
here = f.tell()
197
line = f.readline()
198
print
'Second line ='
, `line`
199
f.seek(-len(line), 1)
200
line2 = f.read(len(line))
201
if
line != line2:
202
raise
RuntimeError,
'bad result after seek back'
203
f.seek(len(line2), 1)
204
list = f.readlines()
205
line = list[-1]
206
f.seek(f.tell() - len(line))
207
line2 = f.read()
208
if
line != line2:
209
raise
RuntimeError,
'bad result after seek back from EOF'
210
print
'Read'
, len(list),
'more lines'
211
print
'File length ='
, f.tell()
212
if
f.tell() != length:
213
raise
RuntimeError,
'bad length'
214
f.close()
215
216
if
__name__ ==
'__main__'
:
217
test
()
builtin
StringIO.py
Generated on Mon Feb 17 2014 12:38:43 for Vega strike Python Modules doc by
1.8.4