我希望函数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
答案 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)
也请帮个忙:使用有意义的名称。 a
,b
和c
毫无意义,您必须查找如何使用这些变量来找出它们的含义。正确的命名使代码更具可读性:
def get_playlists(client_id, client_secret, whatever_is_c_we_dont_know_but_you_proably_do):
# ...