Extract a member from the archive as a file object. `member' may be a filename or a TarInfo object. If `member' is a regular file or a link, an io.BufferedReader object is returned. For all other existing members, None is returned. If `member' does not appear
(self, member)
| 2353 | self._dbg(1, "tarfile: %s %s" % (type(e).__name__, e)) |
| 2354 | |
| 2355 | def extractfile(self, member): |
| 2356 | """Extract a member from the archive as a file object. `member' may be |
| 2357 | a filename or a TarInfo object. If `member' is a regular file or |
| 2358 | a link, an io.BufferedReader object is returned. For all other |
| 2359 | existing members, None is returned. If `member' does not appear |
| 2360 | in the archive, KeyError is raised. |
| 2361 | """ |
| 2362 | self._check("r") |
| 2363 | |
| 2364 | if isinstance(member, str): |
| 2365 | tarinfo = self.getmember(member) |
| 2366 | else: |
| 2367 | tarinfo = member |
| 2368 | |
| 2369 | if tarinfo.isreg() or tarinfo.type not in SUPPORTED_TYPES: |
| 2370 | # Members with unknown types are treated as regular files. |
| 2371 | return self.fileobject(self, tarinfo) |
| 2372 | |
| 2373 | elif tarinfo.islnk() or tarinfo.issym(): |
| 2374 | if isinstance(self.fileobj, _Stream): |
| 2375 | # A small but ugly workaround for the case that someone tries |
| 2376 | # to extract a (sym)link as a file-object from a non-seekable |
| 2377 | # stream of tar blocks. |
| 2378 | raise StreamError("cannot extract (sym)link as file object") |
| 2379 | else: |
| 2380 | # A (sym)link's file object is its target's file object. |
| 2381 | return self.extractfile(self._find_link_target(tarinfo)) |
| 2382 | else: |
| 2383 | # If there's no data associated with the member (directory, chrdev, |
| 2384 | # blkdev, etc.), return None instead of a file object. |
| 2385 | return None |
| 2386 | |
| 2387 | def _extract_member(self, tarinfo, targetpath, set_attrs=True, |
| 2388 | numeric_owner=False): |
no test coverage detected