Pergunta

Estou tentando criar um arquivo .csv com os valores de uma lista Python. Quando imprimo os valores na lista, todos são unicode (?), Ou seja, eles se parecem algo assim

[u'value 1', u'value 2', ...]

Se eu itero através dos valores na lista, ou seja, for v in mylist: print v Eles parecem ser texto simples.

E eu posso colocar um , entre cada um com print ','.join(mylist)

E eu posso produzir para um arquivo, ou seja,

myfile = open(...)
print >>myfile, ','.join(mylist)

Mas quero produzir 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, eu tentei através do join declaração. Como posso fazer isso?

Foi útil?

Solução

import csv

with open(..., 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)

EDIT: Isso funciona apenas com o Python 2.x.

Para fazê -lo funcionar com Python 3.x Substitua wb com w (Veja isso tão responde)

with open(..., 'w', newline='') as myfile:
     wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
     wr.writerow(mylist)

Outras dicas

Aqui está uma versão segura do Alex Martelli's:

import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)

A melhor opção que encontrei foi usar o savetxt de numpy módulo:

import numpy as np
np.savetxt("file_name.csv", data1, delimiter=",", fmt='%s', header=header)

Caso você tenha várias listas que precisam ser empilhadas

np.savetxt("file_name.csv", np.column_stack((data1, data2)), delimiter=",", fmt='%s', header=header)

Para outra abordagem, você pode usar Quadro de dados dentro Pandas: E pode despejar facilmente os dados para CSV, assim como o código abaixo:

import pandas
df = pandas.DataFrame(data={"col1": list_1, "col2": list_2})
df.to_csv("./file.csv", sep=',',index=False)

Use Python's csv Módulo para leitura e gravação de arquivos delimitados por vírgula ou Tab. O módulo CSV é preferido porque oferece um bom controle sobre a citação.

Por exemplo, aqui está o exemplo trabalhado para você:

import csv
data = ["value %d" % i for i in range(1,4)]

out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL)
out.writerow(data)

Produz:

"value 1","value 2","value 3"

Você pode usar o método String.Join neste caso.

Divida em algumas linhas para clareza - aqui está uma sessão interativa

>>> a = ['a','b','c']
>>> first = '", "'.join(a)
>>> second = '"%s"' % first
>>> print second
"a", "b", "c"

Ou como uma única linha

>>> print ('"%s"') % '", "'.join(a)
"a", "b", "c"

No entanto, você pode ter um problema é que suas cordas tenham cotações incorporadas. Se for esse o caso, você precisará decidir como escapar deles.

o Módulo CSV Pode cuidar de tudo isso para você, permitindo que você escolha entre várias opções de cotação (todos os campos, apenas campos com cotações e seperadores, apenas campos não numéricos, etc.) e como controlar o ESACPE Charecters (citações duplas ou strings escapados) . Se seus valores forem simples, o String.Join provavelmente ficará bem, mas se você precisar gerenciar muitos casos de borda, use o módulo disponível.

Notebook Jupyter

Digamos que sua lista é A

Em seguida, você pode codificar o seguinte anúncio que o terá como um arquivo CSV (apenas colunas!)

R="\n".join(A)
f = open('Columns.csv','w')
f.write(R)
f.close()

Você deve usar o módulo CSV, com certeza, mas as chances são de escrever Unicode. Para aqueles que precisam escrever Unicode, esta é a classe da página de exemplo, que você pode usar como um módulo Util:

import csv, codecs, cStringIO

class UTF8Recoder:
    """
    Iterator that reads an encoded stream and reencodes the input to UTF-8
    """
    def __init__(self, f, encoding):
        self.reader = codecs.getreader(encoding)(f)

def __iter__(self):
    return self

def next(self):
    return self.reader.next().encode("utf-8")

class UnicodeReader:
    """
    A CSV reader which will iterate over lines in the CSV file "f",
    which is encoded in the given encoding.
    """

def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
    f = UTF8Recoder(f, encoding)
    self.reader = csv.reader(f, dialect=dialect, **kwds)

def next(self):
    row = self.reader.next()
    return [unicode(s, "utf-8") for s in row]

def __iter__(self):
    return self

class UnicodeWriter:
    """
    A CSV writer which will write rows to CSV file "f",
    which is encoded in the given encoding.
"""

def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
    # Redirect output to a queue
    self.queue = cStringIO.StringIO()
    self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
    self.stream = f
    self.encoder = codecs.getincrementalencoder(encoding)()

def writerow(self, row):
    self.writer.writerow([s.encode("utf-8") for s in row])
    # Fetch UTF-8 output from the queue ...
    data = self.queue.getvalue()
    data = data.decode("utf-8")
    # ... and reencode it into the target encoding
    data = self.encoder.encode(data)
    # write to the target stream
    self.stream.write(data)
    # empty queue
    self.queue.truncate(0)

def writerows(self, rows):
    for row in rows:
        self.writerow(row)

Aqui está outra solução que não requer o csv módulo.

print ', '.join(['"'+i+'"' for i in myList])

Exemplo :

>>> myList = [u'value 1', u'value 2', u'value 3']
>>> print ', '.join(['"'+i+'"' for i in myList])
"value 1", "value 2", "value 3"

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 assim:

print ', '.join(['"'+myFunction(i)+'"' for i in myList])

Essas soluções parecem loucas, mas funciona bem como mel

import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL,delimiter='\n')
    wr.writerow(mylist)

O arquivo está sendo escrito pelo CSVWriter, portanto, as propriedades do CSV são mantidas, ou seja, separadas por vírgula. O delimitador ajuda na parte principal movendo itens da lista para a próxima linha, cada vez.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top