You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[doc] Clarify bytes vs text with non-seeking tarfile stream #67641
$ 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 commentedon 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 commentedon 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 commentedon 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.
[-]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[/+][-]Clarify bytes vs text with non-seeking tarfile stream[/-][+][doc] Clarify bytes vs text with non-seeking tarfile stream[/+]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…