【问题标题】:Is there a library for parsing through JSON data using Spotipy?是否有使用 Spotipy 解析 JSON 数据的库?
【发布时间】:2022-10-08 03:01:22
【问题描述】:

我一直在使用 Spotipy 作为我的第一个中间项目,当我从我的帐户中获取数据时,它给了我一堆 JSON 格式的数据。有可能我只是做错了,但据我所见,使用 Web API 从 Spotify 用户那里获取超过 50 个给定项目真的很困难。这个限制很容易通过,只需使用多个带有偏移量的 API 调用。

我的目标是拥有一本可读性强的字典,这样我就可以获取我想要的任何给定数据。这是我到目前为止的字典设置,我正计划把它做得更大

    spot_obj = spotipy.Spotify(auth=token_info['access_token'])

    spot_dict['user'] = spot_obj.current_user()
    spot_dict['liked_songs'] = spot_obj.current_user_saved_tracks()
    spot_dict['playlists'] = spot_obj.current_user_playlists()
    spot_dict['saved_albums'] = spot_obj.current_user_saved_albums()
    spot_dict['num_of_liked_songs'] = spot_obj.current_user_saved_tracks()['total']

但是,当我尝试抓取 50 多个项目时,通过创建一个带有偏移量的 for 循环,新编辑的 JSON 文件具有不同的格式,因此 51 多首歌曲和其他歌曲都在其他地方。以下是此处响应中代码的编辑版本:Limits for Spotipy?

        tracks = []
        for x in range(1, 10):
            response = spot_obj.current_user_saved_tracks(limit=50,offset=x * 50)
            if len(response) == 0:
                break
            tracks.append(response)
        return tracks

这里的问题是tracks.append(response) 创建了一个新列表(数组?它由[] 分隔)。这样,如果我想进行第二次迭代,我需要创建一个新的 for 循环来访问它。这确实效率低下且笨拙。 (if 语句也永远不会成为真的,因为 Spotify 总是会返回一些东西,只是这些字段会是空的)

本质上,我是在询问如何更轻松地清理 JSON 数据的方向,但我不确定内置的 json 将如何提供帮助。我确定它会在某个地方,但我认为这根本不是编码问题,Python 将所有这些视为字典、列表、字符串等。最好的是一个易于访问的模块,它可以通过这个进行解析,并且更容易绕过“50 限制”。我找不到任何可以做到这一点的东西,如果我弄清楚了,我会很高兴自己制作并发布它,我只需要一个指针

这就是我一直在格式化我想要的数据的方式,这就是为什么我需要在一个地方访问所有数据

        song_list = []
        for track in spot_dict['liked_songs']['items']:
            song = track['track']['name']
            artist = track['track']['album']['artists'][0]['name']
            album = track['track']['album']['name']
            release = track['track']['album']['release_date']
            song_tup = (song, artist, album, release)
            song_list.append(song_tup)

【问题讨论】:

    标签: python json spotify spotipy


    【解决方案1】:

    使用extend() 而不是append() 来连接列表,而不是创建嵌套列表。

    曲目列表位于响应的 items 键中,因此请连接这些列表。

    tracks.extend(response['items'])
    

    【讨论】:

    • 使用 track.extend(response) 只为我提供了按顺序排列的数据标题:["href","items","limit","next","offset","previous","total","href","items","limit","next","offset","previous","total"] 乘以 10。使用 append 为我提供了我需要的数据,但不是格式,请参见此处:i.imgur.com/dBQXIFt.png
    • 我假设response 是 API 返回的 50 个项目的列表。如果您只是获取标题,那听起来就像是一本字典。你能添加一个print(response) 的例子吗?使用较小的limit,这样它就不是 50 个项目。
    • pastebin.com/V3rbQWP3 这是 for 循环的三个迭代,每个迭代限制为 3 首歌曲。每次迭代都由 [] 分隔,因此它们实际上并不在一起。我正在寻找的是能够将不同迭代的“项目”的所有值放入“项目”的一次迭代中。我只是不理解 JSON 以及 Python 如何处理这样的事情足以做任何事情。我还使用了jsonviewer.stack.hu 以提高 JSON 的可读性
    • 我懂了。它返回一个字典,项目列表在字典的items: 元素中。
    【解决方案2】:

    编辑:如果有人关心我为这个https://github.com/nate-llc/spotipy-pagination做了一个分页工具

    我让它工作了。

        def songs(spot_obj):
                total = response = spot_obj.current_user_saved_tracks(limit=1)['total']
                iterations = (int((total / 50)) + (total % 50 > 0))
    
                tracks = []
                for x in range(iterations):
                    response = spot_obj.current_user_saved_tracks(limit=50,offset=x * 50)
                    tracks.append(response)
                
                #looks inside of the tracks list, yoinks the ['items'], then adds them to one list
                song_list = []      
                for iteration in tracks:
                    for x in range(len(iteration['items'])):
                        song_list.append(iteration['items'][x])
                return song_list
    songs(spot_obj = spotipy.Spotify(auth=token_info['access_token'])
    
    

    所以这假设您已经拥有了 spotipy 用户对象。然后我们查看 current_user_saved_tracks() 的不同迭代,获取 ['items'] 值并将它们添加到一个更大的组合列表中。 (如果这让您感到困惑,请查看 current_user_saved_tracks() 的格式化 json)

    我们通过查看歌曲总数来获得迭代,将该数字除以 50,然后四舍五入。

    否则,我认为如果有人要运行这段代码,他们会明白它为什么有用。如果有人有任何问题,请随时 dm 我或您在本网站上所做的任何事情

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-24
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多