다음과 같은 사전 목록이 있습니다.
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)