ฉันมีรายการพจนานุกรมที่มีลักษณะดังนี้:
toCSV = [{'name':'bob','age':25,'weight':200},{'name':'jim','age':31,'weight':180}]
ฉันควรทำอย่างไรเพื่อแปลงไฟล์นี้เป็นไฟล์ csv ที่มีลักษณะดังนี้:
name,age,weight
bob,25,200
jim,31,180
ฉันมีรายการพจนานุกรมที่มีลักษณะดังนี้:
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 เหมาะสมกว่าที่นี่
with open('people.csv', 'wb') as f: ...
dict_writer.writeheader()
แทนdict_writer.writer.writerow(keys)
open('people.csv', 'w')
set().union(*(d.keys() for d in mylist))
ที่จะได้รับกุญแจทั้งหมดในรายการ (ถ้าคุณมีบางอย่างที่ไม่ได้มีกุญแจทั้งหมด.)
นี่คือเมื่อคุณมีรายการพจนานุกรมหนึ่งรายการ:
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
ใน 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.to_dict('records')
csv
โมดูลวานิลลาคุณต้องป้อนOrderedDict
หรือจะปรากฏขึ้นตามลำดับแบบสุ่ม (หากทำงานใน python <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 ที่ใช้ที่นี่จะเก็บรักษาลำดับใน python> 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)