如何修复“ TypeError:只能将列表(而不是“ str”)连接到列表”错误

时间:2019-09-19 00:28:44

标签: python python-2.7

我希望函数getPlaylists(a,b,c)从列表a,b和c中获取值并运行,直到使用每个列表中的所有元素为止。

具体来说,我想设置getPlaylists(a,b,c),使其先运行getPlaylists(a[0],b[0],c[0]),然后再运行getPlaylists(a[1],b[1],c[1])等,直到它完成列表a,b和c中的所有值。

我尝试运行getPlaylists(a[0:],b[0:],c[0:]),但出现错误:

  

“ TypeError:只能将列表(而不是“ str”)连接到列表”

我还尝试了运行getPlaylists(a[0],b[0],c[0]),然后在下一行运行getPlaylists(a[1],b[1],c[1])。只有第一个功能可以成功打印。

import spotipy
from spotipy.oauth2 import SpotifyClientCredentials


def getPlaylists(a,b,c):
    client_credentials_manager = SpotifyClientCredentials(client_id=a, client_secret=b)
    sp = spotipy.Spotify(client_credentials_manager=client_credentials_manager)

    playlists = sp.user_playlists(c)

    while playlists:
        for i, playlist in enumerate(playlists['items']):
            print("%4d %s %s" % (i + 1 + playlists['offset'], playlist['uri'],  playlist['name']))
        if playlists['next']:
            playlists = sp.next(playlists)
        else:
            playlists = None
a= ["7ce6355bc7a34c659b6ce0b6a0c53395","a15e38973eb64f9bba30258a9dde407d"]
b= ["026081a8e1a544dbbcc2bf8a373f3088","8af7eaa281dc49a58d08e46adf06e637"]
c= ["121147088","20mc3a9w582vc7a7o5cjm03d8"]

getPlaylists(a[0:],b[0:],c[0:])

我希望每个Spotify帐户中的所有播放列表都能打印出来。但是,当我像上面那样格式化代码时,会出现以下错误:

Traceback (most recent call last):
  File "C:/Users/19083/AppData/Local/Programs/Python/Python37-32/SpotifyTest2_9.18.py", line 22, in <module>
    getPlaylists(a[0:],b[0:],c[0:])
  File "C:/Users/19083/AppData/Local/Programs/Python/Python37-32/SpotifyTest2_9.18.py", line 9, in getPlaylists
    playlists = sp.user_playlists(c)
  File "C:\Users\19083\AppData\Local\Programs\Python\Python37-32\lib\site-packages\spotipy\client.py", line 366, in user_playlists
    offset=offset)
  File "C:\Users\19083\AppData\Local\Programs\Python\Python37-32\lib\site-packages\spotipy\client.py", line 146, in _get
    return self._internal_call('GET', url, payload, kwargs)
  File "C:\Users\19083\AppData\Local\Programs\Python\Python37-32\lib\site-packages\spotipy\client.py", line 100, in _internal_call
    headers = self._auth_headers()
  File "C:\Users\19083\AppData\Local\Programs\Python\Python37-32\lib\site-packages\spotipy\client.py", line 90, in _auth_headers
    token = self.client_credentials_manager.get_access_token()
  File "C:\Users\19083\AppData\Local\Programs\Python\Python37-32\lib\site-packages\spotipy\oauth2.py", line 57, in get_access_token
    token_info = self._request_access_token()
  File "C:\Users\19083\AppData\Local\Programs\Python\Python37-32\lib\site-packages\spotipy\oauth2.py", line 67, in _request_access_token
    auth_header = base64.b64encode(str(self.client_id + ':' + self.client_secret).encode())
TypeError: can only concatenate list (not "str") to list

1 个答案:

答案 0 :(得分:0)

这里:

getPlaylists(a[0:],b[0:],c[0:])

a[0:]slice notation)的意思是“将列表a中的子列表元素从索引0返回到最后一项- IOW, it returns a列表(and in this case the whole list), not a single item. You want改为[0]。

这就是说,您的数据结构错误。使用“平行列表”(2个或更多列表,应该根据位置对项目进行匹配)非常脆弱-对列表之一进行重新排序,整个东西都坏了……这里的适当结构应该是元组列表或字典,即:

clients = [
   # (client_id, client_secret, what_is_c)
   ("7ce6355bc7a34c659b6ce0b6a0c53395", "026081a8e1a544dbbcc2bf8a373f3088", "121147088"),
   # etc
   ]

可让您轻松遍历它:

for a, b, c in clients:
    getPlaylists(a, b, c)

或使用*args语法:

for args in clients:
    getPlaylists(*args)

也请帮个忙:使用有意义的名称abc毫无意义,您必须查找如何使用这些变量来找出它们的含义。正确的命名使代码更具可读性:

def get_playlists(client_id, client_secret, whatever_is_c_we_dont_know_but_you_proably_do):
    # ...