Estou tentando criar um arquivo .csv com os valores de uma lista Python. Quando imprimo os valores na lista, eles são todos unicode (?), Ou seja, se parecem com isso
[u'value 1', u'value 2', ...]
Se eu percorrer os valores da lista, ou seja, for v in mylist: print v
eles parecem ser texto sem formatação.
E eu posso colocar um ,
entre cada um comprint ','.join(mylist)
E eu posso imprimir em um arquivo, ou seja
myfile = open(...)
print >>myfile, ','.join(mylist)
Mas eu quero enviar para um CSV e ter delimitadores em torno dos valores na lista, por exemplo
"value 1", "value 2", ...
Não consigo encontrar uma maneira fácil de incluir os delimitadores na formatação, por exemplo, tentei a join
declaração. Como posso fazer isso?
Respostas:
Edit: isso só funciona com python 2.x.
Para fazê-lo funcionar com o python 3.x, substitua
wb
porw
( consulte esta resposta do SO )fonte
csv
módulo no 2.x não lida corretamente com unicodes; consulte a documentação do módulo para obter exemplos de como lidar com isso. docs.python.org/library/csv.htmlTypeError: 'str' does not support the buffer interface
.'w'
como aqui: stackoverflow.com/questions/34283178/…Aqui está uma versão segura do de Alex Martelli:
fonte
with
, certificando-se o arquivo é fechado quando feitowr.writerow(my_list)
dentro do loop?Para outra abordagem, você pode usar o DataFrame nos pandas : e pode facilmente despejar os dados no CSV, como no código abaixo:
fonte
A melhor opção que encontrei foi usar o
savetxt
donumpy
módulo :Caso você tenha várias listas que precisam ser empilhadas
fonte
Use o
csv
módulo python para ler e escrever arquivos delimitados por vírgula ou tabulação. O módulo csv é preferido, pois oferece um bom controle sobre a citação.Por exemplo, aqui está o exemplo trabalhado para você:
Produz:
fonte
out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL))
preenche os dados, independentemente de você colocaropen("myfile.csv","w")
um novo arquivoopen("myfile2.csv","w")
. Parece que o objeto out não pode lidar com o objeto de arquivo criado na execução, mas armazena o processo de saída como um todo. o objeto out armazena o objeto file na primeira execução, mas só está gravando quando o objeto file já existe! Veja a solução correta abaixo @Saurabh AdhikaryVocê pode usar o método string.join nesse caso.
Divida algumas linhas para maior clareza - aqui está uma sessão interativa
Ou como uma única linha
No entanto, você pode ter um problema, pois suas strings possuem aspas incorporadas. Se for esse o caso, você precisará decidir como escapar deles.
O módulo CSV pode cuidar de tudo isso para você, permitindo escolher entre várias opções de cotação (todos os campos, apenas campos com aspas e separadores, apenas campos não numéricos, etc.) e como esacpe controlar caracteres (aspas duplas ou cordas escapadas). Se seus valores forem simples, string.join provavelmente estará OK, mas se você precisar gerenciar muitos casos extremos, use o módulo disponível.
fonte
Esta solução parece loucura, mas funciona suave como mel
O arquivo está sendo gravado pelo csvwriter, portanto, as propriedades do csv são mantidas, isto é, separadas por vírgula. O delimitador ajuda na parte principal, movendo os itens da lista para a próxima linha, a cada vez.
fonte
data = [["value %d" % i, "value %d" % (i+1)] for i in range(1,4)] with open("myfile.txt","w") as f: out = csv.writer(f, quoting=csv.QUOTE_ALL, delimiter='\n') out.writerow([';'.join(x) for x in data])
Para criar e gravar em um arquivo csv
O exemplo abaixo demonstra a criação e gravação de um arquivo csv. para criar um gravador de arquivo dinâmico, precisamos importar um pacote import csv e , em seguida, criar uma instância do arquivo com a referência de arquivo Ex: - com open ("D: \ sample.csv", "w", newline = "" ) como file_writer
aqui, se o arquivo não existir com o diretório de arquivos mencionado, o python criará o mesmo arquivo no diretório especificado e "w" representa gravação, se você quiser ler um arquivo, substitua "w" por "r" ou anexe para o arquivo existente então "a". newline = "" especifica que ele remove uma linha vazia extra a cada vez que você cria uma linha. Para eliminar a linha vazia, usamos newline = "", crie alguns nomes de campos (nomes de colunas) usando uma lista como fields = ["Names", "Age "," Class "] e , em seguida, aplique à instância do writer como writer = csv.DictWriter (file_writer, fieldnames = fields) aqui usando o Dictionary writer e atribuindo nomes de colunas, para escrever nomes de colunas no csv, usamos writer. , enquanto a escrita dos valores do arquivo deve ser transmitida usando o método do dicionário, aqui a chave é o nome da coluna e o valor é o respectivo valor da chave
fonte
Caderno Jupyter
Digamos que sua lista seja
A
Em seguida, você pode codificar o seguinte anúncio, que o terá como um arquivo csv (apenas colunas!)
fonte
você deve usar o módulo CSV com certeza, mas as chances são de que você precisa escrever unicode. Para aqueles que precisam escrever unicode, esta é a classe da página de exemplo, que você pode usar como um módulo utilitário:
fonte
Aqui está outra solução que não requer o
csv
módulo.Exemplo:
No entanto, se a lista inicial contiver alguns ", eles não serão escapados. Se for necessário, é possível chamar uma função para escapar dessa maneira:
fonte