exportar - Crear un archivo.csv con valores de una lista de Python
python csv writer example (10)
Libreta Jupyter
Digamos que tu lista es A
Luego puede codificar el siguiente anuncio, lo tendrá como un archivo csv (¡solo columnas!)
R="/n".join(A)
f = open(''Columns.csv'',''w'')
f.write(R)
f.close()
Estoy tratando de crear un archivo .csv con los valores de una lista de Python. Cuando imprimo los valores en la lista, todos son unicode (?), Es decir, se ven algo como esto
[u''value 1'', u''value 2'', ...]
Si repito los valores en la lista, es decir, for v in mylist: print v
, parecen ser texto sin formato.
Y puedo poner un ,
entre cada uno con print '',''.join(mylist)
Y puedo enviar a un archivo, es decir,
myfile = open(...)
print >>myfile, '',''.join(mylist)
Pero quiero dar salida a un CSV y tener delimitadores alrededor de los valores en la lista, por ejemplo
"value 1", "value 2", ...
No puedo encontrar una manera fácil de incluir los delimitadores en el formateo, por ejemplo, he intentado con la declaración de join
. ¿Cómo puedo hacer esto?
Aquí hay otra solución que no requiere el módulo csv
.
print '', ''.join([''"''+i+''"'' for i in myList])
Ejemplo:
>>> myList = [u''value 1'', u''value 2'', u''value 3'']
>>> print '', ''.join([''"''+i+''"'' for i in myList])
"value 1", "value 2", "value 3"
Sin embargo, si la lista inicial contiene algunos ", no se escapará. Si es necesario, es posible llamar a una función para escapar de esa manera:
print '', ''.join([''"''+myFunction(i)+''"'' for i in myList])
Aquí hay una versión segura de Alex Martelli:
import csv
with open(''filename'', ''wb'') as myfile:
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
wr.writerow(mylist)
La mejor opción que he encontrado fue usar savetxt
desde el módulo numpy
:
import numpy as np
np.savetxt("file_name.csv", data1, delimiter=",", fmt=''%s'', header=header)
En caso de que tenga varias listas que deben apilarse
np.savetxt("file_name.csv", np.column_stack((data1, data2)), delimiter=",", fmt=''%s'', header=header)
Podría usar el método string.join en este caso.
Dividir unas pocas líneas para mayor claridad: esta es una sesión interactiva
>>> a = [''a'',''b'',''c'']
>>> first = ''", "''.join(a)
>>> second = ''"%s"'' % first
>>> print second
"a", "b", "c"
O como una sola línea
>>> print (''"%s"'') % ''", "''.join(a)
"a", "b", "c"
Sin embargo, puede tener un problema si sus cadenas tienen citas incrustadas. Si este es el caso, tendrá que decidir cómo escapar de ellos.
El docs.python.org/library/csv.html puede encargarse de todo esto por usted, lo que le permite elegir entre varias opciones de cotización (todos los campos, solo campos con comillas y separadores, solo campos no numéricos, etc.) y cómo controlar dichos caracteres (comillas dobles, o cadenas escapadas). Si sus valores son simples, string.join probablemente estará bien, pero si tiene que administrar muchos casos extremos, use el módulo disponible.
Utilice el módulo csv
de python para leer y escribir archivos csv
por comas o tabuladores. El módulo csv es preferido porque le da un buen control sobre las cotizaciones.
Por ejemplo, aquí está el ejemplo trabajado para usted:
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)
Produce:
"value 1","value 2","value 3"
debe usar el módulo CSV con seguridad, pero lo más probable es que necesite escribir unicode. Para aquellos que necesitan escribir unicode, esta es la clase de la página de ejemplo, que puede usar como un módulo de utilidad:
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)
import csv
with open("file.csv", ''w'') as myfile:
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
wr.writerow(mylist)
import csv
with open(..., ''wb'') as myfile:
wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
wr.writerow(mylist)