annotate Lib/ArrayIO.py @ 3423:02c9da20b41e legacy-trunk

*** empty log message ***
author Guido van Rossum <guido@python.org>
date Wed, 28 Feb 1996 23:58:09 +0000
parents
children 49ee89e017ab
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3423
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
1 # port of StringIO.py using arrays
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 # ArrayIO.py
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 # jjk 02/28/96 001 direct mod of StringIO, test suite checks out
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 # jjk 02/28/96 002 inherit from StringIO, test suite checks out
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 # jjk 02/28/96 003 add __xx__() functions
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 #
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 # class ArrayIO implements file-like objects that read/write a
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 # string buffer (a.k.a. "memory files").
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 #
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 # all methods that interface with ArrayIO pass strings. Internally, however,
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 # ArrayIO uses an array object.
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 #
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 # the interface is the same as StringIO.py
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 # also handles len(a), a[i], a[i]='x', a[i:j], a[i:j] = aString
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
15 #
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
16
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 import string
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 import array
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 import StringIO
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
20
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 class ArrayIO(StringIO.StringIO):
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 # jjk 02/28/96
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 def __init__(self, buf = ''):
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 #jjk 02/28/96
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 self.buf = array.array('c', buf)
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 self.pos = 0
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 self.closed = 0
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 def __len__(self):
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 #jjk 02/28/96
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 return len(self.buf)
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 def __getitem__(self, key):
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 #jjk 02/28/96
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 return self.buf[key]
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 def __setitem__(self, key, item):
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 #jjk 02/28/96
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 self.buf[key] = item
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 def __getslice__(self, i, j):
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 #jjk 02/28/96
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 return self.buf[i:j].tostring()
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 def __setslice__(self, i, j, aString):
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 #jjk 02/28/96
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 self.buf[i:j] = array.array('c', aString)
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 def read(self, n = 0):
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 #jjk 02/28/96
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 r = StringIO.StringIO.read(self, n)
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 return (r.tostring())
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 def _findCharacter(self, char, start):
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 #probably very slow
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 #jjk 02/28/96
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 for i in range(max(start, 0), len(self.buf)):
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 if (self.buf[i] == char):
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 return(i)
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 return(-1)
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 def readline(self):
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 #jjk 02/28/96
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 i = self._findCharacter('\n', self.pos)
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 if i < 0:
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 newpos = len(self.buf)
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 else:
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 newpos = i+1
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 r = self.buf[self.pos:newpos].tostring()
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 self.pos = newpos
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 return r
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 def write(self, s):
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 #jjk 02/28/96
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 if not s: return
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 if self.pos > len(self.buf):
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 self.buf.fromstring('\0'*(self.pos - len(self.buf)))
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 newpos = self.pos + len(s)
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 self.buf[self.pos:newpos] = array.array('c', s)
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 self.pos = newpos
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 def getvalue(self):
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 #jjk 02/28/96
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 return self.buf.tostring()
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
75
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
76
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 # A little test suite
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 # identical to test suite in StringIO.py , except for "f = ArrayIO()"
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 # too bad I couldn't inherit this :-)
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
80
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 def test():
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
82 import sys
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
83 if sys.argv[1:]:
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 file = sys.argv[1]
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 else:
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 file = '/etc/passwd'
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 lines = open(file, 'r').readlines()
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 text = open(file, 'r').read()
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
89 f = ArrayIO()
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
90 for line in lines[:-2]:
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 f.write(line)
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 f.writelines(lines[-2:])
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 if f.getvalue() != text:
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
94 raise RuntimeError, 'write failed'
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
95 length = f.tell()
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 print 'File length =', length
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
97 f.seek(len(lines[0]))
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 f.write(lines[1])
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 f.seek(0)
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 print 'First line =', `f.readline()`
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 here = f.tell()
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 line = f.readline()
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
103 print 'Second line =', `line`
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 f.seek(-len(line), 1)
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
105 line2 = f.read(len(line))
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
106 if line != line2:
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 raise RuntimeError, 'bad result after seek back'
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 f.seek(len(line2), 1)
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 list = f.readlines()
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
110 line = list[-1]
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
111 f.seek(f.tell() - len(line))
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 line2 = f.read()
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 if line != line2:
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 raise RuntimeError, 'bad result after seek back from EOF'
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 print 'Read', len(list), 'more lines'
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
116 print 'File length =', f.tell()
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
117 if f.tell() != length:
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
118 raise RuntimeError, 'bad length'
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
119 f.close()
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
120
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 if __name__ == '__main__':
02c9da20b41e *** empty log message ***
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 test()