Pregunta

Estoy tratando de crear un archivo CSV con los valores de una lista de Python. Al imprimir los valores en la lista de todos ellos son Unicode (?), Es decir, se ven algo como esto

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

Si iterar a través de los valores de la lista, es decir for v in mylist: print v que parecen ser texto sin formato.

Y puedo poner un , entre cada uno con print ','.join(mylist)

Y puede dar salida a un archivo, es decir,

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

Pero yo quiero dar salida a un archivo CSV y tienen delimitadores en torno a los valores de la lista por ejemplo.

"value 1", "value 2", ... 

No puedo encontrar una manera fácil de incluir los delimitadores en el formato, por ejemplo, He tratado a través del estado join. ¿Cómo puedo hacer esto?

¿Fue útil?

Solución

import csv

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

Edit: esto sólo funciona con Python 2.x

.

Para hacer que funcione con 3.x pitón reemplazar wb con w ( ver este SO responder )

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

Otros consejos

Esta es una versión segura de Alex Martelli de:

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 el uso de la savetxt de la módulo numpy :

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

En caso de tener varias listas que deben ser apilados

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

Por otro enfoque, puede utilizar en pandas : Y puede volcar fácilmente los datos a CSV al igual que el código de abajo:

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

Módulo csv uso de Python para la lectura y la escritura coma o archivos delimitados por tabuladores. Se prefiere el módulo csv, ya que le da un buen control de citar.

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"

Se puede usar el método string.join en este caso.

Dividido en algunas de las líneas para mayor claridad - aquí está 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, es posible que tenga un problema es sus cadenas tienen comillas incrustadas. Si este es el caso, tendrá que decidir cómo escapar de ellos.

El módulo CSV puede hacerse cargo de todo esto para usted, lo que le permite elegir entre varias opciones de cotización (todos los campos, sólo los campos con comillas y separadores, sólo los campos no numéricos, etc.) y cómo Esacpe charecters de control (comillas dobles, o escaparon cuerdas). Si sus valores son simples, string.join será probablemente bien, pero si va a tener que manejar una gran cantidad de casos extremos, utilice el módulo disponible.

Jupyter portátil

Digamos que su lista es A

A continuación, puede codificar el siguiente anuncio que tendrá como un archivo CSV (columnas solamente!)

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

debe usar el módulo de CSV a ciencia cierta, pero lo más probable es, que necesita para escribir Unicode. Para aquellos que necesitan para escribir Unicode, esta es la clase de ejemplo de la página, que se puede utilizar como un 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)

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", que no se escaparon Si es necesario, es posible llamar a una función de escapar de esa manera:

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

Esta solución parece una locura, pero funciona sin problemas como la miel

import csv

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

El archivo está siendo escrito por csvwriter propiedades por lo tanto, csv se mantienen es decir, separados por comas. El delimitador de ayuda en la parte principal moviendo elementos de la lista a la siguiente línea, cada vez.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top