Créer un.fichier csv avec des valeurs provenant d'une liste Python

j'essaie de créer un .fichier csv avec les valeurs d'une liste Python. Quand j'imprime les valeurs dans la liste, elles sont toutes unicode (?), i.e. ils ressemblent à quelque chose comme ceci

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

si je passe en revue les valeurs de la liste, c'est-à-dire for v in mylist: print v , elles semblent être en texte clair.

et je peux mettre un , entre chaque avec print ','.join(mylist)

Et je peux la sortie vers un fichier, c'est à dire

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

mais je veux sortir à un CSV et avoir des délimiteurs autour des valeurs dans la liste par exemple

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

Je n'arrive pas à trouver un moyen facile d'inclure les délimiteurs dans le formatage, par exemple j'ai essayé à travers la déclaration join . Comment puis-je faire cela?

113
demandé sur Austin Cummings 2010-01-18 08:34:08

10 réponses

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 le faire fonctionner avec python 3.x remplacer wb par w ( voir la réponse )

with open(..., 'wb', newline='') as myfile:
     wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
     wr.writerow(mylist)
173
répondu Alex Martelli 2018-08-17 15:34:03

Voici une version sécurisée d'Alex Martelli:

import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)
81
répondu Cristian Garcia 2014-02-19 05:48:28

la meilleure option que j'ai trouvée était d'utiliser le savetxt du numpy module :

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ées

np.savetxt("file_name.csv", np.column_stack((data1, data2)), delimiter=",", fmt='%s', header=header)
16
répondu tokenizer_fsj 2015-05-13 15:30:05

utilisez le module csv de python pour lire et écrire des fichiers délimités par des virgules ou des tabulations. Le module csv est préféré parce qu'il vous donne un bon contrôle sur les citations.

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
répondu vy32 2010-01-18 05:53:30

pour une autre approche, vous pouvez utiliser DataFrame dans pandas : Et il peut facilement transférer les données à csv tout 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)
10
répondu Qy Zuo 2017-07-06 08:33:44

, Vous pouvez utiliser la chaîne.méthode join dans ce cas.

divisé en 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 en une seule ligne

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

cependant, vous pouvez avoir un problème si vos chaînes ont des guillemets intégrés. Si c'est le cas, vous devrez décider comment les échapper.

le module CSV peut prendre soin de tous les ceci pour vous, vous permettant de choisir entre différentes options de citation (Tous les champs, seulement les champs avec les guillemets et les séparateurs, seulement les champs non numériques, etc) et comment esacpe contrôle les charecteurs (guillemets doubles, ou chaînes échappées). Si vos valeurs sont simples, en chaîne.join sera probablement OK mais si vous avez à gérer beaucoup de cas de bord, utilisez le module disponible.

7
répondu Robert Christie 2010-01-18 05:50:42

vous devriez utiliser le module CSV pour sûr , mais les chances sont , vous devez écrire unicode . Pour ceux qui ont besoin d'écrire unicode , voici la classe de la page 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
répondu kommradHomer 2015-01-19 13:41:33

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"

Toutefois, si la première liste contient certains ", ils ne seront pas échappé. Si c'est nécessaire, il est possible d'appeler une fonction pour échapper comme ça :

print ', '.join(['"'+myFunction(i)+'"' for i in myList])
1
répondu Richard 2016-04-13 06:06:53

Jupyter notebook

disons que votre liste est A

alors vous pouvez coder la publicité suivante vous l'aurez comme un fichier csv (colonnes seulement!)

R="\n".join(A)
f = open('Columns.csv','w')
f.write(R)
f.close()
0
répondu rsc05 2018-04-18 11:58:05

cette solution semble folle, mais fonctionne en douceur 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 écrit par csvwriter donc les propriétés csv sont maintenues, 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.

0
répondu Saurabh Adhikary 2018-09-26 10:12:43