Làm cách nào để chuyển đổi danh sách từ điển này sang tệp csv?


160

Tôi có một danh sách các từ điển trông giống như thế này:

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

Tôi nên làm gì để chuyển đổi tệp này thành tệp csv trông giống như thế này:

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

Câu trả lời:


284
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: Giải pháp trước của tôi không xử lý đơn đặt hàng. Theo ghi nhận của Wilduck, DictWriter thích hợp hơn ở đây.


11
Lưu ý rằng cách mở (và đóng) tệp pythonic hơn làwith open('people.csv', 'wb') as f: ...
gozzilli

6
Bạn có thể sử dụng dict_writer.writeheader()thay vìdict_writer.writer.writerow(keys)
megawac

8
Không hoạt động nếu mục danh sách đầu tiên không chứa tất cả các khóa
greg121

61
trong Python 3 đó làopen('people.csv', 'w')
Zev Averbach

3
set().union(*(d.keys() for d in mylist))để lấy tất cả các khóa trong danh sách (nếu bạn có một số khóa không có tất cả các khóa.)
Julian Camilleri

17

đây là khi bạn có một danh sách từ điển:

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

Trong python 3 điều hơi khác một chút, nhưng cách đơn giản hơn và ít bị lỗi hơn. Bạn nên nói với CSV rằng tệp của bạn nên được mở bằng utf8mã hóa, vì nó làm cho dữ liệu đó dễ mang theo hơn cho người khác (giả sử bạn không sử dụng mã hóa hạn chế hơn, như 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)
  • Lưu ý rằng csvtrong python 3 cần newline=''tham số, nếu không, bạn sẽ nhận được các dòng trống trong CSV của mình khi mở trong excel / opencalc.

Ngoài ra: Tôi thích sử dụng trình xử lý csv trong pandasmô-đun. Tôi thấy nó có khả năng chịu đựng các vấn đề mã hóa hơn và gấu trúc sẽ tự động chuyển đổi số chuỗi trong CSV thành đúng loại (int, float, v.v.) khi tải tệp.

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

Ghi chú:

  • gấu trúc sẽ đảm nhiệm việc mở tệp cho bạn nếu bạn cung cấp cho nó một đường dẫn và sẽ mặc định là utf8 trong python3 và cũng tìm ra các tiêu đề.
  • một khung dữ liệu không phải là cấu trúc giống như những gì CSV cung cấp cho bạn, vì vậy bạn thêm một dòng khi tải để có được điều tương tự: dataframe.to_dict('records')
  • gấu trúc cũng giúp việc kiểm soát thứ tự các cột trong tệp csv của bạn dễ dàng hơn nhiều. Theo mặc định, chúng là bảng chữ cái, nhưng bạn có thể chỉ định thứ tự cột. Với csvmô-đun vanilla , bạn cần cung cấp cho nó một OrderedDicthoặc chúng sẽ xuất hiện theo thứ tự ngẫu nhiên (nếu hoạt động trong python <3.5). Xem: Bảo quản thứ tự cột trong Python Pandas DataFrame để biết thêm.

7

Bởi vì @User và @BiXiC đã yêu cầu trợ giúp với UTF-8 ở đây một biến thể của giải pháp bởi @Matthew. (Tôi không được phép bình luận, vì vậy tôi đang trả lời.)

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

Đây sẽ là cách đơn giản nhất để ghi dữ liệu vào tệp .csv


1

Đây là một giải pháp tổng quát hơn, giả sử bạn không có danh sách các hàng (có thể chúng không vừa trong bộ nhớ) hoặc bản sao của các tiêu đề (có thể là write_csvhàm chung):

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)

Lưu ý : hàm tạo OrderedDict được sử dụng ở đây chỉ bảo toàn thứ tự trong python> 3.4. Nếu thứ tự là quan trọng, sử dụng các OrderedDict([('name', 'bob'),('age',25)])hình thức.


chưa bao giờ thấy ai lưu trữ dữ liệu trong một trình tạo trước đây - cách tiếp cận thú vị.
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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.