为什么我导出的 csv 文件不包含列表内容?

Why doesn't my exported csv file contain list contents?

我对 python 有点陌生,并尝试使用 Spotipy 编写一个程序,首先从播放列表中获取 Spotify 歌曲 ID,然后获取有关其声音特征的信息。我可以使用 while 循环获取包含歌曲 ID 的字典列表,但如果我理解正确,该列表将保留在 while 循环中。

在这种情况下,下一步要么保存到循环外的变量,要么将该信息导出到 csv 或其他文件。我现在选择导出,尽管我导出的 csv 文件似乎只包含 header "song_id" 而不是实际的歌曲 ID 本身。我确定这是一个简单的错误,但我似乎无法发现它是什么。有人有什么想法吗?

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 循环时都会写入同一个文件。这将覆盖您已经编写的任何内容。由于您的最后一个循环可能没有任何项目,因此这将为您留下一个仅包含 header.

的文件

为避免这种情况,您只需在开始循环之前打开一次输出文件。这也只会写 header 一次。

例如:

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