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?
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)
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)
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)
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"
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)
, 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.
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)
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])
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()
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.