이 사전 목록을 csv 파일로 어떻게 변환합니까?


답변:


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)

편집 : 내 이전 솔루션이 주문을 처리하지 못합니다. Wilduck이 언급했듯이 DictWriter가 더 적합합니다.


11
보다 with open('people.csv', 'wb') as f: ...
열성적인

6
dict_writer.writeheader()dict_writer.writer.writerow(keys)
megawac

8
작업 첫 번째 목록 항목은 모든 키를 포함하지 않는하지 않는 경우
greg121

61
Python 3에서는open('people.csv', 'w')
Zev Averbach

3
set().union(*(d.keys() for d in mylist))목록에있는 모든 키를 얻으려면 (모든 키가없는 키가있는 경우)
Julian 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파이썬 3는 필요에 newline=''매개 변수를, 그렇지 않으면 당신은 당신의 CSV에 빈 줄을 얻을 때 엑셀 / opencalc에서 오프닝.

또는 pandas모듈 의 csv 처리기를 선호 합니다. 인코딩 문제에 더 관대하다는 것을 알았습니다. 팬더는 파일을로드 할 때 CSV의 문자열 번호를 올바른 유형 (int, float 등)으로 자동 변환합니다.

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

노트 :

  • 팬더는 파일 경로를 지정하면 파일 열기를 처리 utf8하고 python3에서 기본값으로 설정 하고 헤더도 알아냅니다.
  • 데이터 프레임은 CSV가 제공하는 것과 동일한 구조가 아니므로로드시 한 줄을 추가하여 동일한 것을 얻습니다. dataframe.to_dict('records')
  • pandas를 사용하면 CSV 파일의 열 순서를 훨씬 쉽게 제어 할 수 있습니다. 기본적으로 알파벳순이지만 열 순서를 지정할 수 있습니다. 바닐라 csv모듈을 사용하면 공급해야 OrderedDict하거나 무작위 순서로 나타납니다 (파이썬 <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 생성자는 파이썬> 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.