Question

Je suis en train de créer un fichier .csv avec les valeurs d'une liste Python. Lorsque j'imprime les valeurs dans la liste, ils sont tous unicode (?), À savoir qu'ils ressemblent à ceci

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

Si j'itérer les valeurs de la liste à savoir for v in mylist: print v ils semblent être le texte brut.

Et je peux mettre un , entre chacun print ','.join(mylist)

Et je peux vers un fichier, à savoir

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

Mais je veux sortie vers un CSV et ont délimiteurs autour des valeurs de la liste par exemple.

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

Je ne peux pas trouver un moyen facile d'inclure les délimiteurs dans la mise en forme, par exemple Je l'ai essayé à travers la déclaration de join. Comment puis-je faire?

Était-ce utile?

La solution

import csv

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

Edit: cela fonctionne uniquement avec 2.x python

.

Pour le faire fonctionner avec 3.x python remplacer wb avec w ( voir cette réponse SO )

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

Autres conseils

Voici une version sécurisée de Alex Martelli de:

import csv

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

La meilleure option que j'ai trouvé utilisait le savetxt de la module numpy :

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

Dans le cas où vous avez plusieurs listes qui doivent être empilés

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

Pour une autre approche, vous pouvez utiliser dataframe pandas: Et il peut facilement transférer les données au format CSV comme le code ci-dessous:

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

Utilisez le module csv de python pour la lecture et l'écriture par des virgules ou des fichiers délimités par des tabulations. Le module csv est préféré car il vous donne un bon contrôle de citer.

Par exemple, voici l'exemple a marché pour vous:

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)

Produit:

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

Vous pouvez utiliser la méthode string.join dans ce cas.

Réparti sur quelques-unes des lignes pour plus de clarté - est ici une session interactive

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

Ou comme une seule ligne

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

Cependant, vous pouvez avoir un problème vos chaînes ont obtenu Les guillemets. Si tel est le cas, vous devrez décider comment leur échapper.

Le Module CSV peut prendre soin de tout cela pour vous, vous permettant de choisir entre différentes options citant (tous les champs, des champs avec des citations et seperators, seuls les champs non numériques, etc.) et comment esacpe charecters de contrôle (guillemets doubles, ou se sont échappés des chaînes). Si vos valeurs sont simples, string.join sera probablement OK, mais si vous êtes d'avoir à gérer beaucoup de cas de pointe, utilisez le module disponible.

Jupyter bloc-notes

Disons que votre liste est A

Ensuite, vous pouvez coder l'annonce suivante, vous aurez comme un fichier csv (colonnes seulement!)

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

vous devez utiliser le module CSV pour sûr, mais les chances sont, vous devez écrire unicode. Pour ceux qui ont besoin d'écrire unicode, c'est la classe de page par exemple, que vous pouvez utiliser comme un module 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)

Voici une autre solution qui ne nécessite pas le module csv.

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

Exemple:

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

Cependant, si la liste initiale contient certains », ils ne seront pas échappé Si elle est nécessaire, il est possible d'appeler une fonction pour échapper comme ça:

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

Cette solution semble fou, mais fonctionne en douceur comme le miel

import csv

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

Le fichier est en cours d'écriture par des propriétés de csvwriter donc CSV sont maintenus à-dire séparés par des virgules. Le délimiteur aide dans la partie principale en déplaçant les éléments de liste à la ligne suivante, chaque fois.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top