আমি অভিধানগুলির এই তালিকাটি কীভাবে একটি সিএসভি ফাইলে রূপান্তর করব?


160

আমার কাছে অভিধানের একটি তালিকা রয়েছে যা দেখতে এরকম কিছু দেখাচ্ছে:

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

এটিকে এমন কিছু দেখাচ্ছে এমন একটি সিএসভি ফাইলে রূপান্তর করতে আমার কী করা উচিত:

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

উত্তর:


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

সম্পাদনা: আমার পূর্বের সমাধানটি অর্ডারটি পরিচালনা করে না। ওয়াইল্ডকের দ্বারা উল্লিখিত হিসাবে, ডিক্টরাইটার এখানে আরও উপযুক্ত।


11
দ্রষ্টব্য যে ফাইলগুলি খোলার (এবং বন্ধ করার) আরও একটি অজগর উপায় হ'লwith open('people.csv', 'wb') as f: ...
গিজিলি

6
আপনি dict_writer.writeheader()dict_writer.writer.writerow(keys)
মেগাওয়াক

8
প্রথম তালিকার আইটেমটিতে সমস্ত কী না থাকলে কাজ করে না
গ্রেগ 121

61
পাইথন 3 এ এটিopen('people.csv', 'w')
জেভ অ্যাভারবাচ 10'17

3
set().union(*(d.keys() for d in mylist))তালিকাতে সকল চাবি পেতে (যদি আপনি কিছু যা সব কী না থাকায় রয়েছে।)
জুলিয়ান Camilleri

17

এটি আপনার যখন একটি অভিধান তালিকা থাকে:

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

17

পাইথনে 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=''প্যারামিটারের প্রয়োজন হয় , অন্যথায় আপনি এক্সেল / ওপেনক্যালক খোলার সময় আপনার সিএসভিতে ফাঁকা লাইন পান।

বিকল্পভাবে: আমি pandasমডিউলটিতে সিএসভি হ্যান্ডলারের ব্যবহার পছন্দ করি । আমি দেখতে পেয়েছি এটি এনকোডিংয়ের বিষয়ে আরও সহনশীল এবং ফাইলটি লোড করার সময় পান্ডাগুলি স্বয়ংক্রিয়ভাবে সিএসভিতে স্ট্রিং নম্বরগুলি সঠিক টাইপ (ইনট, ফ্লোট, ইত্যাদি) এ রূপান্তর করবে।

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

বিঃদ্রঃ:

  • পান্ডারা আপনার জন্য ফাইলটি খোলার যত্ন নেবে যদি আপনি এটিকে কোনও পথ দেন, এবং utf8পাইথন 3 এ ডিফল্ট হয়ে যাবে এবং শিরোনামগুলিও বের করে ফেলবে।
  • সিএসভি আপনাকে যা দেয় তা ডেটাফ্রেম একই কাঠামো নয়, সুতরাং একই জিনিসটি পাওয়ার জন্য আপনি লোড করার পরে একটি লাইন যুক্ত করেন: dataframe.to_dict('records')
  • পান্ডাস আপনার সিএসভি ফাইলে কলামের ক্রম নিয়ন্ত্রণ করা আরও সহজ করে তোলে। ডিফল্টরূপে এগুলি বর্ণানুক্রমিক তবে আপনি কলামের ক্রম নির্দিষ্ট করতে পারেন। ভ্যানিলা csvমডিউল সহ, আপনাকে এটিকে একটি খাওয়ানো দরকার OrderedDictবা এগুলি এলোমেলোভাবে ক্রম হিসাবে উপস্থিত হবে (যদি অজগর <3.5 এ কাজ করে থাকে)। দেখুন: পাইথন পান্ডাস ডেটা ফ্রেমে আরও কলামের অর্ডার সংরক্ষণ করা

7

কারণ @ ইউজার এবং @ বিআইসিআইসি ইউটিএফ -8 এর সাথে এখানে @ ম্যাথিউ দ্বারা সমাধানের বিভিন্নতা চেয়েছিল। (আমাকে মন্তব্য করার অনুমতি নেই, তাই আমি উত্তর দিচ্ছি।)

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)

2
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 ফাইলে ডেটা লেখার সহজ উপায় এটি


1

এখানে আরও একটি সাধারণ সমাধান যা ধরে নিয়েছে যে আপনার কাছে সারিগুলির একটি তালিকা নেই (সম্ভবত তারা স্মৃতিতে ফিট করে না) বা শিরোনামের অনুলিপি (সম্ভবত 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)

দ্রষ্টব্য : এখানে ব্যবহৃত অর্ডারডিক্ট কনস্ট্রাক্টর কেবল অজগর> 3.4 এ অর্ডার সংরক্ষণ করে। যদি অর্ডার গুরুত্বপূর্ণ হয় তবে OrderedDict([('name', 'bob'),('age',25)])ফর্মটি ব্যবহার করুন ।


এর আগে কেউ কখনও জেনারেটরে ডেটা সঞ্চয় করতে দেখেনি - আকর্ষণীয় পদ্ধতির।
মার্ক ম্যাক্সমিস্টার

1
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)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.