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

다음과 같은 사전 목록이 있습니다.

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

이것을 다음과 같은 CSV 파일로 변환하려면 어떻게해야합니까?

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



답변

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가 더 적합합니다.


답변

사전 목록이 하나 인 경우입니다.

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


답변

파이썬 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에서 열 순서 유지를 참조하십시오 .

답변

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


답변

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 파일에 데이터를 쓰는 가장 간단한 방법입니다.


답변

다음은 행 목록 (메모리에 맞지 않을 수도 있음) 또는 헤더 사본 ( 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)])양식을 사용하십시오 .


답변

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)