Maak een .csv-bestand met waarden uit een Python-lijst

Ik probeer een .csv-bestand te maken met de waarden uit een Python-lijst. Als ik de waarden in de lijst afdruk, zijn ze allemaal unicode (?), d.w.z. ze zien er ongeveer zo uit

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

Als ik de waarden in de lijst doorloop, bijv. for v in mylist: print v, lijken ze platte tekst te zijn.

En ik kan een , tussen elk plaatsen met print ','.join(mylist)

En ik kan output naar een bestand, bijv.

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

Maar ik wil output naar een CSV en heb scheidingstekens rond de waarden in de lijst, bijvoorbeeld

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

Ik kan geen gemakkelijke manier vinden om de scheidingstekens in de opmaak op te nemen, b.v. Ik heb het geprobeerd via de join-instructie. Hoe kan ik dit doen?


Antwoord 1, autoriteit 100%

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

Bewerken: dit werkt alleen met python 2.x.

Om het te laten werken met python 3.x vervangt u wb door w (zie dit SO-antwoord)

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

Antwoord 2, autoriteit 40%

Hier is een beveiligde versie van Alex Martelli’s:

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

Antwoord 3, autoriteit 18%

Voor een andere benadering kunt u DataFrame gebruiken in panda’s:
En het kan de gegevens gemakkelijk naar csv dumpen, net als de onderstaande code:

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

Antwoord 4, autoriteit 13%

De beste optie die ik heb gevonden was het gebruik van de savetxt van de numpy module:

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

In het geval u meerdere lijsten heeft die gestapeld moeten worden

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

Antwoord 5, autoriteit 4%

Gebruik de csv-module van python voor het lezen en schrijven van door komma’s of tabs gescheiden bestanden. De csv-module heeft de voorkeur omdat deze u een goede controle geeft over het citeren.

Hier is bijvoorbeeld het uitgewerkte voorbeeld voor u:

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)

Produceert:

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

Antwoord 6, autoriteit 3%

Je zou in dit geval de methode string.join kunnen gebruiken.

Verdeel een paar regels voor de duidelijkheid – hier is een interactieve sessie

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

Of als een enkele regel

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

U kunt echter een probleem hebben met ingesloten aanhalingstekens in uw strings. Als dit het geval is, moet je beslissen hoe je eraan kunt ontsnappen.

De CSV-module kan dit allemaal voor u regelen, zodat u kies tussen verschillende opties voor aanhalingstekens (alle velden, alleen velden met aanhalingstekens en scheidingstekens, alleen niet-numerieke velden, enz.) Als uw waarden eenvoudig zijn, is string.join waarschijnlijk in orde, maar als u veel randgevallen moet beheren, gebruikt u de beschikbare module.


Antwoord 7, autoriteit 2%

Deze oplossing klinkt gek, maar werkt zo soepel als honing

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

Het bestand wordt geschreven door csvwriter, vandaar dat de csv-eigenschappen behouden blijven, d.w.z. door komma’s gescheiden.
Het scheidingsteken helpt in het hoofdgedeelte door lijstitems elke keer naar de volgende regel te verplaatsen.


Antwoord 8, autoriteit 2%

Hier is een werkend kopieer-plakvoorbeeld voor Python 3.x met opties om uw eigen scheidingsteken en aanhalingstekens te definiëren.

import csv
mylist = ['value 1', 'value 2', 'value 3']
with open('employee_file.csv', mode='w') as employee_file:
    employee_writer = csv.writer(employee_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL)
    employee_writer.writerow(mylist)

Hiermee wordt employee_file.csv gegenereerd die er als volgt uitziet:

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

OPMERKING:

Als citeren is ingesteld op csv.QUOTE_MINIMAL, dan zal .writerow() citeren
velden alleen als ze het scheidingsteken of het aanhalingsteken bevatten. Dit is
het standaardgeval.

Als citeren is ingesteld op csv.QUOTE_ALL, dan zal .writerow() alles citeren
velden.

Als citeren is ingesteld op csv.QUOTE_NONNUMERIC, dan zal .writerow() citeren
alle velden met tekstgegevens en converteer alle numerieke velden naar de
float gegevenstype.

Als citeren is ingesteld op csv.QUOTE_NONE, dan zal .writerow() ontsnappen
scheidingstekens in plaats van ze te citeren. In dit geval moet u ook:
geef een waarde op voor de optionele parameter escapechar.


Antwoord 9, autoriteit 2%

Jupyter-notebook

Stel dat uw lijstnaam A

is

Dan kun je het volgende coderen en je hebt het als een csv-bestand (alleen kolommen!)

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

Antwoord 10

Een csv-bestand maken en erin schrijven

Het onderstaande voorbeeld demonstreert het maken en schrijven van een csv-bestand.
om een ​​dynamische bestandsschrijver te maken, moeten we een pakket importeren import csv en vervolgens een instantie van het bestand maken met bestandsreferentie
Bijvoorbeeld:- met open(“D:\sample.csv”,”w”,newline=””) als file_writer

hier als het bestand niet bestaat met de genoemde bestandsmap, dan zal python hetzelfde bestand maken in de opgegeven map, en “w” staat voor schrijven, als je een bestand wilt lezen, vervang dan “w” door “r” of om toe te voegen aan een bestaand bestand en vervolgens “a”. newline=”” geeft aan dat het een extra lege rij verwijdert voor elke keer dat u een rij maakt, dus om lege rijen te elimineren gebruiken we newline=””, maken enkele veldnamen (kolomnamen) met behulp van een lijst zoals fields=[“Namen” ,”Leeftijd”,”Klasse”], en pas dan toe op schrijversinstantie zoals
writer=csv.DictWriter(file_writer,fieldnames=fields)
hier gebruiken we Dictionary writer en het toewijzen van kolomnamen, om kolomnamen naar csv te schrijven gebruiken we writer.writeheader() en om waarden te schrijven gebruiken we writer.writerow({“Names”:”John” ,”Age”:20,”Class”:”12A”}) , terwijl het schrijven van bestandswaarden moet worden doorgegeven met behulp van de woordenboekmethode , hier is de sleutel de kolomnaam en de waarde is uw respectieve sleutelwaarde

import csv 
with open("D:\\sample.csv","w",newline="") as file_writer:
   fields=["Names","Age","Class"]
   writer=csv.DictWriter(file_writer,fieldnames=fields)
   writer.writeheader()
   writer.writerow({"Names":"John","Age":21,"Class":"12A"})

Antwoord 11

je moet zeker de CSV-module gebruiken, maar de kans is groot dat je unicode moet schrijven. Voor degenen die unicode moeten schrijven, dit is de klasse van voorbeeldpagina, die u als util-module kunt gebruiken:

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)

Antwoord 12

Hier is een andere oplossing waarvoor de module csv niet nodig is.

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

Voorbeeld:

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

Als de eerste lijst echter enkele ” bevat, worden ze niet geëscaped. Als het nodig is, is het mogelijk om een ​​functie aan te roepen om er zo aan te ontsnappen :

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

Antwoord 13

Voor wie op zoek is naar een minder gecompliceerde oplossing. Ik vind dit eigenlijk nog een simplistische oplossing die vergelijkbaar werk zal doen:

import pandas as pd
a = ['a','b','c'] 
df = pd.DataFrame({'a': a})
df= df.set_index('a').T
df.to_csv('list_a.csv', index=False)

Hopelijk helpt dit ook.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

20 − twenty =

Other episodes