Crie um arquivo .csv com valores de uma lista de Python
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?
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.