Domanda

Sto cercando di creare un file .csv con i valori da un elenco Python. Quando stampo i valori nella lista sono tutti unicode (?), Vale a dire si guardano qualcosa di simile

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

Se io scorrere i valori nell'elenco cioè for v in mylist: print v sembrano essere solo testo.

E posso mettere una , tra ciascuna con print ','.join(mylist)

E posso output in un file, vale a dire

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

Ma voglio output a un file CSV e hanno delimitatori attorno ai valori nell'elenco per es.

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

Non riesco a trovare un modo semplice per includere i delimitatori della formattazione, ad esempio, Ho cercato attraverso la dichiarazione join. Come posso fare questo?

È stato utile?

Soluzione

import csv

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

Edit: questo funziona solo con python 2.x

.

Per farlo funzionare con Python 3.x sostituire wb con w ( vedere questo SO rispondere )

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

Altri suggerimenti

Ecco una versione sicura di Alex Martelli di:

import csv

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

L'opzione migliore che ho trovato è stato utilizzando il savetxt dal modulo numpy :

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

Nel caso in cui si dispone di più elenchi che devono essere impilati

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

Per un altro approccio, è possibile utilizzare dataframe in panda : E si può facilmente scaricare i dati in formato CSV, proprio come il codice qui sotto:

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

modulo csv Usa di pitone per la lettura e la scrittura virgola o file delimitati da tabulazioni. Il modulo csv è preferito perché ti dà un buon controllo sui citando.

Per esempio, qui è l'esempio lavorato per voi:

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"

È possibile utilizzare il metodo string.join in questo caso.

Spalato nel corso di un paio di righe per chiarezza - ecco una sessione interattiva

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

O come una sola riga

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

Tuttavia, potrebbe essere un problema è le corde hanno avuto citazioni incorporati. Se questo è il caso dovrete decidere come sfuggire loro.

Il modulo csv può prendersi cura di tutto questo per te, che consente di scegliere tra varie opzioni di quotazione (tutti i campi, campi solo con citazioni e seperators, solo campi non numerici, ecc) e come esacpe charecters di controllo (virgolette doppie, o fuggiti stringhe). Se i valori sono semplici, string.join sarà probabilmente male, ma se si hanno a gestire un sacco di casi limite, utilizzare il modulo disponibile.

Jupyter notebook

Diciamo che l'elenco è A

Quindi è possibile codificare il seguente annuncio si avrà come file CSV (colonne solo!)

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

è necessario utilizzare il modulo CSV per certo, ma le probabilità sono, è necessario scrivere unicode. Per chi ha bisogno di scrivere unicode, questa è la classe dall'esempio pagina, che è possibile utilizzare come modulo 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)

Ecco un'altra soluzione che non richiede il modulo csv.

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

Esempio:

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

Tuttavia, se la lista iniziale contiene alcuni", non saranno sfuggiti Se necessario, è possibile chiamare una funzione di fuggire in quel modo:

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

Questa soluzione sembra folle, ma funziona liscio come il miele

import csv

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

Il file sia scritto da csvwriter proprietà quindi csv vengono mantenuti cioè separati da virgole. Il delimitatore aiuta nella parte principale spostando voci di elenco alla riga successiva, ogni volta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top