简体   繁体   中英

How to iterate over a bytes object in Python?

I am doing a POST request in Django and I am receiving a bytes object. I need to count the number of times a particular user appears on this object but I am receiving the following error TypeError: 'int' object is not subscriptable . This is what I have so far:

def filter_url(user):
    ''' do the POST request, this code works '''

    filters = {"filter": {
    "filters": [{
        "field": "Issue_Status",
        "operator": "neq",
        "value": "Queued"
    }],
    "logic": "and"}}

    url = "http://10.61.202.98:8081/Dev/api/rows/cat/tickets?"
    response = requests.post(url, json=filters)
    return response

def request_count():
    '''This code requests a POST method and then it stores the result of all the data 
    for user001 as a bytes object in the response variable. Afterwards, a call to the 
    perform_count function is made to count the number of times that user user001 appeared.'''

    user = "user001"
    response = filter_url(user).text.encode('utf-8')
    weeks_of_data = []     
    weeks_of_data.append(perform_count(response))

def perform_count(response):
    ''' This code does not work, int object is not subscriptable '''
    return Counter([k['user_id'] for k in response)

#structure of the bytes object
b'[{"id":1018002,"user_id":"user001","registered_first_time":"Yes", ...}]'

# This is the result that indicates that response is a bytes object.
print(type(response))
<class 'bytes'>

How can I count the number of times that user001 appears by using the the peform_count() function? Which modification does this function require to work?

You do receive bytes, yes, but you then have the requests library decode it (via the response.text attribute, which automatically decodes the data ), which you then re-encode yourself:

response = filter_url(user).text.encode('utf-8')

Apart from just using the response.content attribute instead to avoid the decode -> encode round-trip, you should really just decode the data as JSON :

data = filter_url(user).json()

Now data is a list of dictionaries, and your perform_count() function can operate on that directly.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM