Python 为什么';我导出的csv文件是否包含列表内容?

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

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

在这种情况下,下一步要么保存到循环外的变量,要么将该信息导出到csv或其他文件。我现在选择导出,虽然我导出的csv文件似乎只包含标题“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
循环中运行时都会写入同一个文件。这将覆盖您已经编写的任何内容。由于您的最后一个循环可能没有任何项,这将给您留下一个只包含头的文件

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

例如:

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中缩进,当然,当我现在想到它时,它看起来很明显。