From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Sun, 20 Jul 2025 13:16:26 +0000 (+0200) Subject: [3.13] gh-86608: Improve and restructure tarfile examples (GH-121771) (#136867) X-Git-Tag: v3.13.6~62 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=74607b139d188762bf55ccb9d417b114bac0b12a;p=thirdparty%2FPython%2Fcpython.git [3.13] gh-86608: Improve and restructure tarfile examples (GH-121771) (#136867) gh-86608: Improve and restructure tarfile examples (GH-121771) Add an example on how to write a tarfile to stdout; general improvements. (cherry picked from commit cc81b4e501138b5793d419c81c3a2859a17207a7) Co-authored-by: Dominic H Co-authored-by: Adam Turner <9087854+AA-Turner@users.noreply.github.com> --- diff --git a/Doc/library/tarfile.rst b/Doc/library/tarfile.rst index e82198939605..5532ffa1ad27 100644 --- a/Doc/library/tarfile.rst +++ b/Doc/library/tarfile.rst @@ -1304,6 +1304,9 @@ Command-line options Examples -------- +Reading examples +~~~~~~~~~~~~~~~~~~~ + How to extract an entire tar archive to the current working directory:: import tarfile @@ -1326,6 +1329,23 @@ a generator function instead of a list:: tar.extractall(members=py_files(tar)) tar.close() +How to read a gzip compressed tar archive and display some member information:: + + import tarfile + tar = tarfile.open("sample.tar.gz", "r:gz") + for tarinfo in tar: + print(tarinfo.name, "is", tarinfo.size, "bytes in size and is ", end="") + if tarinfo.isreg(): + print("a regular file.") + elif tarinfo.isdir(): + print("a directory.") + else: + print("something else.") + tar.close() + +Writing examples +~~~~~~~~~~~~~~~~ + How to create an uncompressed tar archive from a list of filenames:: import tarfile @@ -1341,19 +1361,15 @@ The same example using the :keyword:`with` statement:: for name in ["foo", "bar", "quux"]: tar.add(name) -How to read a gzip compressed tar archive and display some member information:: +How to create and write an archive to stdout using +:data:`sys.stdout.buffer ` in the *fileobj* parameter +in :meth:`TarFile.add`:: - import tarfile - tar = tarfile.open("sample.tar.gz", "r:gz") - for tarinfo in tar: - print(tarinfo.name, "is", tarinfo.size, "bytes in size and is ", end="") - if tarinfo.isreg(): - print("a regular file.") - elif tarinfo.isdir(): - print("a directory.") - else: - print("something else.") - tar.close() + import sys + import tarfile + with tarfile.open("sample.tar.gz", "w|gz", fileobj=sys.stdout.buffer) as tar: + for name in ["foo", "bar", "quux"]: + tar.add(name) How to create an archive and reset the user information using the *filter* parameter in :meth:`TarFile.add`::