$ tar cvf test.tar.gz tests/
tests/
tests/foo1
tests/foo/
tests/foo/bar
$ tar -O -xvf test.tar | ./tarstream.py
tests/
tests/foo1
tests/foo/
tests/foo/bar
Traceback (most recent call last):
File "./tarstream.py", line 6, in <module>
tarobj = tarfile.open(mode='r|', fileobj=sys.stdin)
File "/usr/lib/python3.4/tarfile.py", line 1578, in open
t =cls(name, filemode, stream, **kwargs)
File "/usr/lib/python3.4/tarfile.py", line 1470, in __init__self.firstmember =self.next()
File "/usr/lib/python3.4/tarfile.py", line 2249, in next
tarinfo =self.tarinfo.fromtarfile(self)
File "/usr/lib/python3.4/tarfile.py", line 1082, in fromtarfile
buf = tarfile.fileobj.read(BLOCKSIZE)
File "/usr/lib/python3.4/tarfile.py", line 535, in read
buf =self._read(size)
File "/usr/lib/python3.4/tarfile.py", line 543, in _readreturnself.__read(size)
File "/usr/lib/python3.4/tarfile.py", line 569, in __readself.buf += buf
TypeError: can't concat bytes to str
Using fileobj=sys.stdin.buffer instead should do the trick. The “tarfile” module would expect a binary stream, not a text stream.
Given the documentation currently says, “Use this variant in combination with e.g. sys.stdin, . . .”, I presume that is why you were using plain stdin. The documentation should be clarified.
Looks like the _Stream docstring needs a similar fix regarding stdin and stdout. Also, it wouldn’t hurt to specify that the read() and write() methods should work with bytes, not text.
changed the title [-]Opening a stream with tarfile.open() triggers a TypeError: can't concat bytes to str error[/-][+]Clarify bytes vs text with non-seeking tarfile stream[/+]on Apr 29, 2016
changed the title [-]Clarify bytes vs text with non-seeking tarfile stream[/-][+][doc] Clarify bytes vs text with non-seeking tarfile stream[/+]on Dec 1, 2021
Activity
chaica commented on Feb 12, 2015
I'm trying to use a tar stream to a Python tarfile object but each time I do have a TypeError: can't concat bytes to str error
Here is my test:
-----8<-----
#!/usr/bin/python3.4
Regards,
Carl Chenet
vadmium commented on Feb 12, 2015
Using fileobj=sys.stdin.buffer instead should do the trick. The “tarfile” module would expect a binary stream, not a text stream.
Given the documentation currently says, “Use this variant in combination with e.g. sys.stdin, . . .”, I presume that is why you were using plain stdin. The documentation should be clarified.
vadmium commented on Apr 29, 2016
Looks like the _Stream docstring needs a similar fix regarding stdin and stdout. Also, it wouldn’t hurt to specify that the read() and write() methods should work with bytes, not text.
gh-67641: Clarify documentation on bytes vs text with non-seeking tar…
pythongh-67641: Clarify documentation on bytes vs text with non-seeki…
pythongh-67641: Clarify documentation on bytes vs text with non-seeki…
[3.12] gh-67641: Clarify documentation on bytes vs text with non-seek…
[3.11] gh-67641: Clarify documentation on bytes vs text with non-seek…
pythongh-67641: Clarify documentation on bytes vs text with non-seeki…
pythongh-67641: Clarify documentation on bytes vs text with non-seeki…
pythongh-67641: Clarify documentation on bytes vs text with non-seeki…