Bu sözlük listesini bir csv dosyasına nasıl dönüştürebilirim?


Yanıtlar:


286
import csv
toCSV = [{'name':'bob','age':25,'weight':200},
         {'name':'jim','age':31,'weight':180}]
keys = toCSV[0].keys()
with open('people.csv', 'wb') as output_file:
    dict_writer = csv.DictWriter(output_file, keys)
    dict_writer.writeheader()
    dict_writer.writerows(toCSV)

EDIT: Benim önceki çözüm siparişi işlemez. Wilduck tarafından belirtildiği gibi, DictWriter burada daha uygundur.


11
Dosyaları açmak (ve kapatmak) için daha pythonic bir yol olduğunu unutmayınwith open('people.csv', 'wb') as f: ...
gozzilli

6
Bunun dict_writer.writeheader()yerine kullanabilirsinizdict_writer.writer.writerow(keys)
megawac

8
İlk liste öğesi tüm anahtarları içermiyorsa çalışmaz
greg121

61
Python 3'teopen('people.csv', 'w')
Zev Averbach

3
set().union(*(d.keys() for d in mylist))(Eğer tüm anahtarları bizde olmayan bazı varsa.) listedeki tüm anahtarlarını almak için
Julian Camilleri

18

Python 3'te işler biraz farklı, ama daha basit ve daha az hata eğilimli. CSV'ye dosyanızın utf8kodlama ile açılması gerektiğini söylemek iyi bir fikirdir , çünkü bu verilerin başkaları için daha taşınabilir olmasını sağlar (daha kısıtlayıcı bir kodlama kullanmadığınız varsayılarak latin1)

import csv
toCSV = [{'name':'bob','age':25,'weight':200},
         {'name':'jim','age':31,'weight':180}]
with open('people.csv', 'w', encoding='utf8', newline='') as output_file:
    fc = csv.DictWriter(output_file, 
                        fieldnames=toCSV[0].keys(),

                       )
    fc.writeheader()
    fc.writerows(toCSV)
  • csvPython 3'te newline=''parametreye ihtiyaç duyulduğunu unutmayın , aksi takdirde excel / opencalc'de açarken CSV'nizde boş çizgiler elde edersiniz.

Alternatif olarak: pandasModüldeki csv işleyicisini kullanmayı tercih ederim . Kodlama sorunlarını daha toleranslı buluyorum ve pandalar dosyayı yüklerken otomatik olarak CSV'lerde dize numaralarını doğru türe (int, float, vb.) Dönüştürecek.

import pandas
dataframe = pandas.read_csv(filepath)
list_of_dictionaries = dataframe.to_dict('records')
dataframe.to_csv(filepath)

Not:

  • pandalar bir yol verirseniz dosyayı sizin için açmaya özen gösterir utf8ve python3'te varsayılan olarak kullanılır ve başlıkları da bulur.
  • bir veri çerçevesi CSV'nin size verdiği yapı ile aynı değildir, bu nedenle aynı şeyi almak için yükleme üzerine bir satır eklersiniz: dataframe.to_dict('records')
  • pandas ayrıca csv dosyanızdaki sütunların sırasını kontrol etmeyi çok daha kolay hale getirir. Varsayılan olarak alfabetiktir, ancak sütun sırasını belirleyebilirsiniz. Vanilya csvmodülü ile, onu beslemeniz gerekir OrderedDictveya rastgele bir sırada görünürler (python <3.5'te çalışıyorsa). Daha fazla bilgi için bkz. Python Pandas DataFrame'de sütun sırasını koruma .

17

bir sözlük listeniz olduğunda:

import csv
with open('names.csv', 'w') as csvfile:
    fieldnames = ['first_name', 'last_name']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})

7

Çünkü @User ve @BiXiC, UTF-8 ile ilgili yardım istediğinde, çözümün @Matthew tarafından bir varyasyonu var. (Yorum yapma iznim yok, bu yüzden cevap veriyorum.)

import unicodecsv as csv
toCSV = [{'name':'bob','age':25,'weight':200},
         {'name':'jim','age':31,'weight':180}]
keys = toCSV[0].keys()
with open('people.csv', 'wb') as output_file:
    dict_writer = csv.DictWriter(output_file, keys)
    dict_writer.writeheader()
    dict_writer.writerows(toCSV)

2
import csv

with open('file_name.csv', 'w') as csv_file:
    writer = csv.writer(csv_file)
    writer.writerow(('colum1', 'colum2', 'colum3'))
    for key, value in dictionary.items():
        writer.writerow([key, value[0], value[1]])

Bu, .csv dosyasına veri yazmanın en basit yolu olacaktır


1

İşte bir satır listesi (belki de belleğe sığmıyorsa) veya başlıkların bir kopyası (belki de write_csvişlev geneldir) varsayalım, daha genel bir çözüm :

def gen_rows():
    yield OrderedDict(name='bob', age=25, weight=200)
    yield OrderedDict(name='jim', age=31, weight=180)

def write_csv():
    it = genrows()
    first_row = it.next()  # __next__ in py3
    with open("people.csv", "w") as outfile:
        wr = csv.DictWriter(outfile, fieldnames=list(first_row))
        wr.writeheader()
        wr.writerow(first_row)
        wr.writerows(it)

Not : Burada kullanılan OrderedDict yapıcısı yalnızca python> 3.4'teki düzeni korur. Sipariş önemliyse OrderedDict([('name', 'bob'),('age',25)])formu kullanın .


Daha önce hiç kimsenin verileri bir jeneratörde sakladığını görmedim - ilginç bir yaklaşım.
Marc Maxmeister

1
import csv
toCSV = [{'name':'bob','age':25,'weight':200},
         {'name':'jim','age':31,'weight':180}]
header=['name','age','weight']     
try:
   with open('output'+str(date.today())+'.csv',mode='w',encoding='utf8',newline='') as output_to_csv:
       dict_csv_writer = csv.DictWriter(output_to_csv, fieldnames=header,dialect='excel')
       dict_csv_writer.writeheader()
       dict_csv_writer.writerows(toCSV)
   print('\nData exported to csv succesfully and sample data')
except IOError as io:
    print('\n',io)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.