Zacznijmy, od tego, że to nie zadziała. Na przykład:
>>> open("temp.data", "rb").read()
b'\xfd7zXZ\x00\x00\x04\xe6\xd6'
>>> str(open("temp.data", "rb").read())
"b'\\xfd7zXZ\\x00\\x00\\x04\\xe6\\xd6'"
Jak widać, str() nie zamienia danych binarnych na stringa, tylko pokazuje reprezentację tekstową zmiennej, nawet włącznie z "b" i apostrofami '.
"normalnym" sposobem zamiany bajtów na string jest zdekodować używając jakiegoś kodowania tekstu, ale...
>>> open("temp.data", "rb").read().decode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfd in position 0: invalid start byte
Bo ta operacja po prostu nie ma logicznego sensu. Typ stringowy `str` jest dla tekstu. Bajty przeczytane z pliku .zip nie są tekstem, więc niemożliwym jest sensownie zamienić je na str. To powinno zostać w typie bajtowym, takim jaki dostajesz z .read().
Ewentualnie można zakodować bajty hexowo:
>>> open("temp.data", "rb").read().hex()
'fd377a585a000004e6d6'
Ale to już się do sprowadza do pytania, co w zasadzie chcesz zrobić i po co w ogóle to robisz.