Python 为什么';我导出的csv文件是否包含列表内容?
我对python有点陌生,正在尝试使用Spotipy编写一个程序,首先从播放列表中获取Spotify歌曲ID,然后获取其声音特征的信息。我能够使用while循环获取包含歌曲ID的dict列表,但如果我理解正确,该列表将保留在while循环中 在这种情况下,下一步要么保存到循环外的变量,要么将该信息导出到csv或其他文件。我现在选择导出,虽然我导出的csv文件似乎只包含标题“song_id”,而不是实际的歌曲id本身。我确信这是一个简单的错误,但我似乎无法发现它是什么。有人有什么想法吗Python 为什么';我导出的csv文件是否包含列表内容?,python,pandas,csv,oauth-2.0,spotipy,Python,Pandas,Csv,Oauth 2.0,Spotipy,我对python有点陌生,正在尝试使用Spotipy编写一个程序,首先从播放列表中获取Spotify歌曲ID,然后获取其声音特征的信息。我能够使用while循环获取包含歌曲ID的dict列表,但如果我理解正确,该列表将保留在while循环中 在这种情况下,下一步要么保存到循环外的变量,要么将该信息导出到csv或其他文件。我现在选择导出,虽然我导出的csv文件似乎只包含标题“song_id”,而不是实际的歌曲id本身。我确信这是一个简单的错误,但我似乎无法发现它是什么。有人有什么想法吗 impor
import pandas as pd
from spotipy.oauth2 import SpotifyClientCredentials
import spotipy
from pprint import pprint
import csv
sp = spotipy.Spotify(client_credentials_manager=SpotifyClientCredentials())
#get songs from the Pop Connoisseur Playlist
pl_id = 'spotify:playlist:5AvWMqi0lbzSPvDR6WWesu'
offset = 0
while True:
response = sp.playlist_tracks(pl_id, offset=offset, fields='items.track.id,total')
pc_tracks = [x['track']['id'] for x in response['items']]
print(pc_tracks)
offset = offset + len(response['items'])
print(offset, "/", response['total'])
s = 0
with open('popconn.csv', 'w', newline='') as csvfile:
fieldnames = ['song_id']
thewriter = csv.DictWriter(csvfile, fieldnames = fieldnames)
thewriter.writeheader()
for song in pc_tracks:
s += 1
thewriter.writerow({'song_id': song})
if len(response['items']) == 0:
break
您的代码每次在
while True
循环中运行时都会写入同一个文件。这将覆盖您已经编写的任何内容。由于您的最后一个循环可能没有任何项,这将给您留下一个只包含头的文件
为了避免这种情况,在开始循环之前只需打开一次输出文件。这也将只写一次头
例如:
import pandas as pd
from spotipy.oauth2 import SpotifyClientCredentials
import spotipy
from pprint import pprint
import csv
sp = spotipy.Spotify(client_credentials_manager=SpotifyClientCredentials())
#get songs from the Pop Connoisseur Playlist
pl_id = 'spotify:playlist:5AvWMqi0lbzSPvDR6WWesu'
offset = 0
with open('popconn.csv', 'w', newline='') as csvfile:
fieldnames = ['song_id']
thewriter = csv.DictWriter(csvfile, fieldnames=fieldnames)
thewriter.writeheader()
while True:
response = sp.playlist_tracks(pl_id, offset=offset, fields='items.track.id,total')
pc_tracks = [x['track']['id'] for x in response['items']]
print(pc_tracks)
offset = offset + len(response['items'])
print(offset, "/", response['total'])
s = 0
for song in pc_tracks:
s += 1
thewriter.writerow({'song_id': song})
if len(response['items']) == 0:
break
您可能应该将
with open()
行移到while循环上方。每次它都会覆盖popconn.csv文件(不是附加文件)。谢谢,Martin。我只是把它弄得一团糟,似乎无法让它正常工作。要澄清:您是指完整的with open()行:with open('popcon.csv','w',newline='')作为csvfile:fieldnames=['song\u id']…您的意思是在while循环开始之前,或者循环中的第一件事之前?要澄清,请尝试从with open…
移动到…writeheader()
在您的上方,而。您需要更改缩进。那一点只需要做一次。好的,太好了,我试试看。再次感谢!啊,是的,这很有魅力!代码非常方便;我没有意识到你的意思是while循环必须在with中缩进,当然,当我现在想到它时,它看起来很明显。