ฉันจะแปลงรายการพจนานุกรมนี้เป็นไฟล์ csv ได้อย่างไร


160

ฉันมีรายการพจนานุกรมที่มีลักษณะดังนี้:

toCSV = [{'name':'bob','age':25,'weight':200},{'name':'jim','age':31,'weight':180}]

ฉันควรทำอย่างไรเพื่อแปลงไฟล์นี้เป็นไฟล์ csv ที่มีลักษณะดังนี้:

name,age,weight
bob,25,200
jim,31,180

คำตอบ:


285
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)

แก้ไข: โซลูชันก่อนหน้าของฉันไม่รองรับการสั่งซื้อ ตามที่ระบุไว้โดย Wilduck, DictWriter เหมาะสมกว่าที่นี่


11
โปรดทราบว่าวิธีการเปิด (และปิด) pythonic เพิ่มเติมของไฟล์คือwith open('people.csv', 'wb') as f: ...
gozzilli

6
คุณสามารถใช้dict_writer.writeheader()แทนdict_writer.writer.writerow(keys)
megawac

8
ไม่ทำงานหากรายการแรกไม่มีคีย์ทั้งหมด
greg121

61
ใน Python 3 It'sopen('people.csv', 'w')
Zev Averbach

3
set().union(*(d.keys() for d in mylist))ที่จะได้รับกุญแจทั้งหมดในรายการ (ถ้าคุณมีบางอย่างที่ไม่ได้มีกุญแจทั้งหมด.)
จูเลียน Camilleri

17

นี่คือเมื่อคุณมีรายการพจนานุกรมหนึ่งรายการ:

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'})

17

ในงูหลาม 3 สิ่งที่แตกต่างกันเล็กน้อย แต่วิธีที่ง่ายขึ้นและมีข้อผิดพลาดน้อยลง เป็นความคิดที่ดีที่จะบอกว่าไฟล์ CSV ของคุณควรเปิดด้วยการutf8เข้ารหัสเนื่องจากจะทำให้ข้อมูลนั้นพกพาได้มากขึ้นกับผู้อื่น (สมมติว่าคุณไม่ได้ใช้การเข้ารหัสที่เข้มงวดมากขึ้นเช่น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)
  • โปรดทราบว่าcsvใน python 3 ต้องการnewline=''พารามิเตอร์มิฉะนั้นคุณจะได้รับบรรทัดว่างใน CSV ของคุณเมื่อเปิดใน excel / opencalc

อีกทางเลือกหนึ่ง: ฉันชอบใช้ csv handler ในpandasโมดูล ฉันพบว่ามันมีความทนทานต่อปัญหาการเข้ารหัสมากขึ้นและแพนด้าจะแปลงตัวเลขสตริงใน CSV ให้เป็นประเภทที่ถูกต้อง (int, float, ฯลฯ ) โดยอัตโนมัติเมื่อทำการโหลดไฟล์

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

บันทึก:

  • หมีแพนด้าจะดูแลการเปิดไฟล์ให้คุณถ้าคุณให้มันเป็นเส้นทางและจะใช้ค่าเริ่มต้นutf8ใน python3 และหาส่วนหัวด้วย
  • dataframe ไม่ได้เป็นโครงสร้างเดียวกับที่ CSV ให้คุณดังนั้นคุณจึงเพิ่มหนึ่งบรรทัดเมื่อโหลดเพื่อให้ได้สิ่งเดียวกัน: dataframe.to_dict('records')
  • หมีแพนด้ายังทำให้การควบคุมลำดับของคอลัมน์ในไฟล์ csv ของคุณง่ายขึ้นอีกด้วย โดยค่าเริ่มต้นพวกมันเรียงตามตัวอักษร แต่คุณสามารถระบุลำดับคอลัมน์ได้ ด้วยcsvโมดูลวานิลลาคุณต้องป้อนOrderedDictหรือจะปรากฏขึ้นตามลำดับแบบสุ่ม (หากทำงานใน python <3.5) ดู: การเก็บรักษาลำดับคอลัมน์ใน Python Pandas DataFrameสำหรับข้อมูลเพิ่มเติม

7

เนื่องจาก @User และ @BiXiC ขอความช่วยเหลือกับ UTF-8 ที่นี่รูปแบบของการแก้ปัญหาโดย @Matthew (ฉันไม่ได้รับอนุญาตให้แสดงความคิดเห็นดังนั้นฉันจึงตอบ)

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]])

นี่จะเป็นวิธีที่ง่ายที่สุดในการเขียนข้อมูลไปยังไฟล์. csv


1

นี่คืออีกวิธีแก้ปัญหาทั่วไปที่มากกว่าสมมติว่าคุณไม่มีรายการของแถว (อาจจะไม่พอดีกับหน่วยความจำ) หรือสำเนาของส่วนหัว (อาจเป็นwrite_csvฟังก์ชั่นทั่วไป):

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)

หมายเหตุ : คอนสตรัคต์ OrderedDict ที่ใช้ที่นี่จะเก็บรักษาลำดับใน python> 3.4 เท่านั้น หากการสั่งซื้อมีความสำคัญให้ใช้OrderedDict([('name', 'bob'),('age',25)])แบบฟอร์ม


ไม่เคยเห็นใครเก็บข้อมูลในเครื่องกำเนิดไฟฟ้ามาก่อน - วิธีที่น่าสนใจ
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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.