كيف يمكنني تحويل قائمة القواميس هذه إلى ملف CSV؟
-
28-09-2019 - |
سؤال
لدي قائمة بالقواميس التي تبدو مثل هذا:
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 ملف