मैं शब्दकोशों की इस सूची को सीएसवी फ़ाइल में कैसे बदलूँ?


160

मेरे पास शब्दकोशों की एक सूची है जो कुछ इस तरह दिखती है:

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

इसे एक csv फ़ाइल में बदलने के लिए मुझे क्या करना चाहिए जो कुछ इस तरह दिखती है:

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: ...
gozzilli

6
आप dict_writer.writeheader()इसके बजाय का उपयोग कर सकते हैंdict_writer.writer.writerow(keys)
मेगावाट

8
पहली सूची आइटम में सभी कुंजियाँ नहीं होने पर काम नहीं करता है
greg121

61
पायथन 3 में यह हैopen('people.csv', 'w')
ज़ीव एवेरबैच

3
set().union(*(d.keys() for d in mylist))सूची में सभी कुंजियाँ प्राप्त करने के लिए (यदि आपके पास कुछ है जिसमें सभी कुंजियाँ नहीं हैं।)
जूलियन कैमिलेरी

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रखेगा, और python3 में डिफ़ॉल्ट होगा , और हेडर का भी पता लगाएगा।
  • डेटाफ़्रेम वही संरचना नहीं है जो CSV आपको देता है, इसलिए आप एक ही चीज़ को प्राप्त करने के लिए लोडिंग पर एक पंक्ति जोड़ते हैं: dataframe.to_dict('records')
  • पांडा आपके csv फ़ाइल में कॉलम के क्रम को नियंत्रित करना बहुत आसान बनाता है। डिफ़ॉल्ट रूप से, वे वर्णानुक्रम में हैं, लेकिन आप स्तंभ क्रम निर्दिष्ट कर सकते हैं। वेनिला csvमॉड्यूल के साथ , आपको इसे खिलाने की आवश्यकता है OrderedDictया वे एक यादृच्छिक क्रम में दिखाई देंगे (यदि अजगर <3.5 में काम कर रहा है)। देखें: अधिक के लिए पायथन पंडों डेटाफ्रेम में कॉलम ऑर्डर को संरक्षित करना।

7

क्योंकि @User और @BiXiC ने UTM-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)

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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.