TypeError: sequence item 0 expected str instance, bytes found

14,954

The issue is that file_zip.getinfo('%s.txt'%name).comment apparently returns a bytes object(s). When you try and join on an str, namely ''.join(..) you get the error:

''.join([b'hello', b'\n', b'world'])    
TypeError: sequence item 0: expected str instance, bytes found

Joining on b'' is a viable alternative but, as you note, it doesn't escape special characters like '\n'; that's expected behavior for bytes instances.

You can either decode the string after it has been joined on b'':

print(b''.join(comments).decode())

Or, decode every element of comments with map and join on an empty string '' as you originally attempted:

print(''.join(map(bytes.decode, comments)))
Share:
14,954
wangcs
Author by

wangcs

code*0.2 & debug * 0.8

Updated on June 15, 2022

Comments

  • wangcs
    wangcs almost 2 years

    I am doing a Python challenge but when in mission 6 I met some problems:

    comments = []
    comments.append(file_zip.getinfo('%s.txt'%name).comment)
    print(''.join(comments))
    

    but this give me the error:

    TypeError: sequence item 0: expected str instance, bytes found

    I looked for the answer, and have a try like this:

    print(b''.join(comments))
    

    it works and prints:

    b'***************************************************************\n****************************************************************\n**                                                    **\n**   OO    OO    XX    YYYY    GG    GG  EEEEEE NN      NN  **\n**    OO    OO  XXXXXX   YYYYYY   GG
        GG   EEEEEE  NN    NN   **\n**   OO    OO XXX  XXX YYY   YY  GG GG     EE       NN  NN    **\n**    OOOOOOOO XX    XX YY        GGG       EEEEE     NNNN     **\n**   OOOOOOOO XX    XX YY        GGG       EEEEE      NN      **\n**   OO    OO XXX  XXX YYY   YY  GG GG     EE         NN      **\n**
     OO    OO  XXXXXX   YYYYYY   GG   GG   EEEEEE     NN      **\n**   OO      OO         XX       YYYY    GG    GG  EEEEEE     NN  
    

    I think it regards '/n' as a char and print it, but, I don't want that. How can I make it work?