summaryrefslogtreecommitdiff
path: root/Lib
diff options
context:
space:
mode:
Diffstat (limited to 'Lib')
-rw-r--r--Lib/tarfile.py16
-rw-r--r--Lib/test/test_tarfile.py10
2 files changed, 26 insertions, 0 deletions
diff --git a/Lib/tarfile.py b/Lib/tarfile.py
index 9d0061592e..9bfad250cf 100644
--- a/Lib/tarfile.py
+++ b/Lib/tarfile.py
@@ -616,6 +616,22 @@ class ExFileObject(object):
"""Close the file object.
"""
self.closed = True
+
+ def __iter__(self):
+ """Get an iterator over the file object.
+ """
+ if self.closed:
+ raise ValueError("I/O operation on closed file")
+ return self
+
+ def next(self):
+ """Get the next item from the file iterator.
+ """
+ result = self.readline()
+ if not result:
+ raise StopIteration
+ return result
+
#class ExFileObject
#------------------
diff --git a/Lib/test/test_tarfile.py b/Lib/test/test_tarfile.py
index 0fae5efcd4..a6c4c4a4f9 100644
--- a/Lib/test/test_tarfile.py
+++ b/Lib/test/test_tarfile.py
@@ -91,6 +91,16 @@ class ReadTest(BaseTest):
self.assert_(lines1 == lines2,
"_FileObject.readline() does not work correctly")
+ def test_iter(self):
+ # Test iteration over ExFileObject.
+ if self.sep != "|":
+ filename = "0-REGTYPE-TEXT"
+ self.tar.extract(filename, dirname())
+ lines1 = file(os.path.join(dirname(), filename), "rU").readlines()
+ lines2 = [line for line in self.tar.extractfile(filename)]
+ self.assert_(lines1 == lines2,
+ "ExFileObject iteration does not work correctly")
+
def test_seek(self):
"""Test seek() method of _FileObject, incl. random reading.
"""