Skip to content

Commit 44c49a0

Browse files
committed
A simplistic fileinput module
1 parent 3543085 commit 44c49a0

File tree

1 file changed

+92
-0
lines changed

1 file changed

+92
-0
lines changed

fileinput.py

+92
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
"""
2+
This is a simplistic implementation of fileinput module
3+
"""
4+
import sys
5+
6+
class FileInput(object):
7+
def __init__(self, files=None):
8+
if not files:
9+
self._files = sys.argv[1:]
10+
if not self._files:
11+
self._files = ("_", )
12+
elif isinstance(files, list):
13+
self._files = tuple(files)
14+
elif isinstance(files, basestring):
15+
self._files = (files, )
16+
else:
17+
raise ValueError("Invalid input")
18+
19+
self._file = None
20+
self._fileindex = 0
21+
self._lineindex = 0
22+
self._buffer = None
23+
self._filename = None
24+
self._is_stdin = False
25+
26+
def __iter__(self):
27+
return self
28+
29+
def next(self):
30+
line = self.get_next_line()
31+
if line:
32+
return line
33+
else:
34+
raise StopIteration
35+
36+
def get_next_line(self):
37+
if not self._buffer:
38+
if not self.load_next_file():
39+
return None
40+
try:
41+
line = self._buffer[self._lineindex]
42+
except IndexError:
43+
if self.load_next_file():
44+
return self.get_next_line()
45+
else:
46+
return None
47+
else:
48+
self._lineindex += 1
49+
return line
50+
51+
def load_next_file(self):
52+
if not self._files:
53+
return False
54+
_filename = self._files[0]
55+
self._files = self._files[1:]
56+
self._fileindex += 1
57+
58+
if _filename == "_":
59+
self._filename = "<std input>"
60+
self._file = sys.stdin
61+
self._is_stdin = True
62+
else:
63+
self._filename = _filename
64+
if self._file and not self._is_stdin:
65+
self._file.close()
66+
try:
67+
self._file = open(_filename, "r")
68+
except:
69+
return self.load_next_file()
70+
self._lineindex = 0
71+
self._buffer = self._file.readlines()
72+
if not self._buffer:
73+
return load_next_file()
74+
return True
75+
76+
def lineno(self):
77+
return self._lineindex
78+
79+
def fileno(self):
80+
return self._fileindex
81+
82+
def filename(self):
83+
return self._filename
84+
85+
if __name__ == "__main__":
86+
f = FileInput()
87+
f = FileInput("../test.js")
88+
f = FileInput(["../test.js", "../weixin.txt", "foobar.txt"])
89+
for line in f:
90+
print "%s(%d):%d\t%s"%(f.filename(), f.fileno(), f.lineno(), line)
91+
92+

0 commit comments

Comments
 (0)