use BytesIO instead of StringIO