سؤال

لدي قائمة بالقواميس التي تبدو مثل هذا:

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

لأن 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)

في Python 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 في pandas وحدة. أجد أنه أكثر تسامحًا مع المشكلات ، و ستقوم Pandas تلقائيًا بتحويل أرقام السلسلة في CSVs إلى النوع الصحيح (int ، float ، إلخ) عند تحميل الملف.

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

ملحوظة:

  • سوف تهتم Pandas بفتح الملف لك إذا أعطيته مسارًا ، وسوف تتخلف عن ذلك utf8 في Python3 ، واكتشف الرؤوس أيضًا.
  • لا يمثل نظام البيانات هو نفس الهيكل الذي يوفره لك CSV ، لذلك يمكنك إضافة سطر واحد عند التحميل للحصول على نفس الشيء: dataframe.to_dict('records')
  • كما يسهل Pandas التحكم في ترتيب الأعمدة في ملف CSV الخاص بك. بشكل افتراضي ، فهي أبجدية ، ولكن يمكنك تحديد ترتيب العمود. مع الفانيليا csv الوحدة النمطية ، تحتاج إلى إطعامها OrderedDict أو سوف تظهر بترتيب عشوائي (إذا كنت تعمل في بيثون <3.5). نرى: الحفاظ على ترتيب العمود في Python Pandas DataFrame للمزيد من.

فيما يلي حل آخر أكثر عمومية على افتراض أنه ليس لديك قائمة بالصفوف (ربما لا تتناسب مع الذاكرة) أو نسخة من الرؤوس (ربما 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)

ملحوظة: مُنشئ OrderDict المستخدم هنا يحافظ فقط على الطلب في Python> 3.4. إذا كان الأمر مهمًا ، فاستخدم OrderedDict([('name', 'bob'),('age',25)]) شكل.

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 ملف

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top