Nota: Parece que essa não é a solução preferida devido ao modo como a linha extra foi adicionada em um sistema Windows. Conforme declarado no documento python :
Se csvfile é um objeto de arquivo, ele deve ser aberto com o sinalizador 'b' nas plataformas em que isso faz diferença.
O Windows é uma dessas plataformas em que isso faz a diferença. Embora a alteração do terminador de linha, como descrito abaixo, possa ter corrigido o problema, o problema pode ser evitado ao abrir o arquivo no modo binário. Pode-se dizer que esta solução é mais "elegente". "Brincar" com o terminador de linha provavelmente resultaria em código não transportável entre sistemas nesse caso, onde abrir um arquivo no modo binário em um sistema unix não resulta em nenhum efeito. ie resulta em código compatível entre sistemas.
Do Python Docs :
No Windows, 'b' anexado ao modo abre o arquivo no modo binário; também existem modos como 'rb', 'wb' e 'r + b'. O Python no Windows faz uma distinção entre arquivos de texto e binários; os caracteres de fim de linha nos arquivos de texto são automaticamente ligeiramente alterados quando os dados são lidos ou gravados. Essa modificação nos bastidores dos dados dos arquivos é boa para arquivos de texto ASCII, mas corrompe dados binários como os dos arquivos JPEG ou EXE. Tenha muito cuidado ao usar o modo binário ao ler e gravar esses arquivos. No Unix, não custa acrescentar um 'b' ao modo, para que você possa usá-lo independentemente da plataforma para todos os arquivos binários.
Original :
Como parte dos paramaters opcionais para o csv.writer, se você estiver recebendo linhas em branco extras, talvez seja necessário alterar o determinador de linha (informações aqui ). Exemplo abaixo adaptado da página python csv docs. Altere de '\ n' para o que for. Como isso é apenas uma facada no escuro, isso pode ou não funcionar, mas é o meu melhor palpite.
>>> import csv
>>> spamWriter = csv.writer(open('eggs.csv', 'w'), lineterminator='\n')
>>> spamWriter.writerow(['Spam'] * 5 + ['Baked Beans'])
>>> spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])