web-dev-qa-db-fra.com

Créez un fichier .csv avec les valeurs d'une liste Python

J'essaie de créer un fichier .csv avec les valeurs d'une liste Python. Lorsque j’imprime les valeurs de la liste, elles sont toutes unicode (?), C’est-à-dire qu’elles ressemblent à ceci

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

Si je parcoure les valeurs de la liste, c'est-à-dire for v in mylist: print v, elles semblent être du texte brut.

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

Et je peux sortir dans un fichier, c.-à-d.

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

Mais je veux sortir vers un CSV et avoir des délimiteurs autour des valeurs dans la liste, par exemple.

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

Je ne trouve pas de moyen facile d’inclure les délimiteurs dans la mise en forme, par exemple. J'ai essayé par la déclaration join. Comment puis-je faire ceci?

142
Fortilan
import csv

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

Edit: cela ne fonctionne qu'avec python 2.x.

Pour que cela fonctionne avec python 3.x, remplacez wb par w ( voir la réponse SO )

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

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

import csv

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

La meilleure option que j'ai trouvée utilisait le savetxt du module numpy :

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

Si vous avez plusieurs listes à empiler

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

Pour une autre approche, vous pouvez utiliser DataFrame dans pandas : Et il peut facilement vider les données au format csv exactement 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)
24
Qy Zuo

Utilisez le module csv de python pour lire et écrire des fichiers séparés par des virgules ou des tabulations. Le module csv est préféré car il vous permet de bien contrôler les devis.

Par exemple, voici l'exemple travaillé 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"
12
vy32

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

Découpez quelques lignes pour plus de clarté - voici 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 si vos chaînes ont des guillemets incorporés. Si tel est le cas, vous devrez décider comment leur échapper.

Le module CSV peut s’occuper de tout cela pour vous, en vous permettant de choisir entre diverses options de cotation (tous les champs, uniquement les champs avec guillemets et séparateurs, uniquement les champs non numériques, etc.) et comment esacpe contrôler les caractères (guillemets doubles ou chaînes échappées). Si vos valeurs sont simples, string.join sera probablement OK, mais si vous devez gérer de nombreux cas Edge, utilisez le module disponible.

7
Robert Christie

Cahier Jupyter

Disons que votre liste est A

Ensuite, vous pouvez coder l’annonce suivante et l’avoir sous forme de fichier csv (colonnes uniquement!)

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

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 en contient ", ils ne seront pas échappés. Si nécessaire, il est possible d'appeler une fonction pour l'échapper de la manière suivante:

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

vous devez bien sûr utiliser le module CSV, mais il y a de fortes chances que vous deviez écrire unicode. Pour ceux qui ont besoin d'écrire unicode, voici la classe de la page d'exemple que vous pouvez utiliser comme 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)
1
kommradHomer

Cette solution semble folle, mais fonctionne bien comme du 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 csvwriter et les propriétés csv sont donc conservées, c'est-à-dire séparées par des virgules. Le délimiteur aide dans la partie principale en déplaçant les éléments de la liste à la ligne suivante, à chaque fois.

1
Saurabh Adhikary