প্রতিটি 'কী: মান' এর জন্য একটি লাইন সহ সিএসভি ফাইলে একটি অভিধান রচনা


92

আমার একটি অভিধান আছে:

mydict = {key1: value_a, key2: value_b, key3: value_c}

আমি এই স্টাইলে একটি ফাইল ডিক্ট সিএসভিতে ডেটা লিখতে চাই:

key1: value_a
key2: value_b
key3: value_c

আমি লিখেছিলাম:

import csv
f = open('dict.csv','wb')
w = csv.DictWriter(f,mydict.keys())
w.writerow(mydict)
f.close()

তবে এখন আমার কাছে এক সারিতে সমস্ত কী এবং পরের সারিতে সমস্ত মান রয়েছে ..

আমি যখন এই জাতীয় কোনও ফাইল লিখতে পরিচালনা করি তখন আমি এটি আবার নতুন অভিধানেও পড়তে চাই।

কেবল আমার কোডটি ব্যাখ্যা করার জন্য, অভিধানটিতে টেক্সটেক্ট্রলস এবং চেকবক্সগুলি (ডাব্লুএক্সপিথন ব্যবহার করে) এর মান এবং বুল রয়েছে। আমি "সংরক্ষণ সেটিংস" এবং "লোড সেটিংস" বোতাম যুক্ত করতে চাই। সেভ সেটিংসে ফাইলটিতে ডিকশনারিটি উল্লিখিত উপায়ে লিখতে হবে (ব্যবহারকারীর পক্ষে সরাসরি সিএসভি ফাইল সম্পাদনা করা সহজ করার জন্য), লোড সেটিংসটি ফাইলটি পড়তে হবে এবং পাঠ্যগ্রন্থগুলি এবং চেকবক্সগুলি আপডেট করা উচিত।


4
আউটপুট হিসাবে আপনি যা চান তার একটি আরও ভাল উদাহরণ সরবরাহ করতে পারেন? আপনার উপরের "স্টাইল" CSV নয়। আপনি খুঁজছেন key1, value_a [linebreak] key2, value_b [linebreak] key3, value_c?
tkone

আরেকটি পদ্ধতি হ'ল repr()ডকটি লেখার জন্য ব্যবহার করা এবং তারপরে স্ট্রিংটি সবিস্তারে দেখানো উচিত vs বনাম এবং ডক্স সম্পর্কেও আলোচনার জন্য এই পুরাতন এসও পোস্টটি দেখুনstr()repr()
পিটার রোয়েল

নীচের আমার উত্তর ছাড়াও, যদি আপনি কেবল একটি সরল সিএসভি ফাইলের চেয়ে কিছুটা পরিশীলিত কিছু পছন্দ করেন তবে আপনি ConfigParserমডিউলটি পরীক্ষা করতে চাইতে পারেন
রিকার্ডো কর্ডেনেস

4
আপনি যা বর্ণনা করছেন তা হ'ল সিএসভি মডিউল দ্বারা রচিত সাধারণ সিএসভি ফর্ম্যাট। যদি আপনি একই কীগুলির সাথে একাধিক ডিসিক্ট লেখেন, কীগুলি কেবল একবারই লেখা হবে, প্রথম লাইনে, 1 মানের সাথে কীগুলি সংযুক্ত করার জন্য যথাযথ ক্রম অনুযায়ী যথাযথ মানগুলির জন্য
ডক্টের

উত্তর:


186

DictWriterআপনি আশা করতে কাজ করে না।

with open('dict.csv', 'w') as csv_file:  
    writer = csv.writer(csv_file)
    for key, value in mydict.items():
       writer.writerow([key, value])

এটি আবার পড়তে:

with open('dict.csv') as csv_file:
    reader = csv.reader(csv_file)
    mydict = dict(reader)

যা বেশ কমপ্যাক্ট, তবে এটি ধরে নেয় যে পড়ার সময় আপনার কোনও ধরণের রূপান্তর করার দরকার নেই


4
এমএমএইচ ... সবেমাত্র লক্ষ্য করেছেন যে আপনি একটি নির্দিষ্ট ফর্ম্যাট চেয়েছিলেন যা ঠিক সিএসভি-জাতীয় নয়। ধরে নেওয়া হয়েছে যে আপনি সিএসভি শৈলী চেয়েছিলেন (উদাহরণস্বরূপ, কী-মান জুটির প্রতি এক সারি) কারণ আপনি সিএসভি মডিউলটি ব্যবহার করছিলেন ...
রিকার্ডো কর্ডেনেস

4
বা ... সিএসভি পদ্ধতির ক্ষেত্রে আপনি যেমনটি চেয়েছিলেন ঠিক তেমনই তবে আপনি delimiter=':'লেখক এবং পাঠক তৈরি করার সময়
বিচ্ছেদকারী

4
দ্রষ্টব্য, আপনার লেখার এবং পঠনের মধ্যে ফাইলটি বন্ধ করা উচিত। : দেখুন এই প্রশ্নের / উত্তর কি ঘটেছিল stackoverflow.com/a/38467563/235698
মার্ক Tolonen

4
@ মার্কটোলনেন অবশ্যই ব্যবহার withকরা আরও ভাল। আমি এর প্রতিফলন করার জন্য উদাহরণগুলি পরিবর্তন করব ...
রিকার্ডো কর্ডেনেস

4
@ দয়ারইয়াং বিলম্বের জন্য দুঃখিত আসলে, আমি নিশ্চিত না কেন আমি তখন এটি কেন লিখেছিলাম। এর দরকার নেই। যখন লেখা, এই প্রভাব সম্পর্কে newline অক্ষর অ-অনুবাদিত ছেড়ে চলে যেতে হয় (অর্থাৎ। যদি আপনি লিখতে \n, আপনি পাবেন \nফাইলের মধ্যে)। যদি একা ছেড়ে যায়, "ইউনিভার্সাল মোড" কিক করে এবং নতুন লাইনগুলি বর্তমান অপারেটিং সিস্টেমের জন্য ডিফল্টটিতে অনুবাদ হয়। প্রদত্ত যে এটি এখানে সত্যিই দরকারী নয় (যদি আপনি ভবিষ্যদ্বাণীযোগ্য নতুন লাইনগুলি রাখতে চান তবে), আমি এটি সরিয়ে দেব।
রিকার্ডো কর্ডেনেস

27

কেবল একটি বিকল্প দেওয়ার জন্য, সিএসভি ফাইলে একটি অভিধান লিখতে প্যান্ডাস প্যাকেজ দিয়েও কাজ করা যেতে পারে। প্রদত্ত উদাহরণের সাথে এটি এমন কিছু হতে পারে:

mydict = {'key1': 'a', 'key2': 'b', 'key3': 'c'}

import pandas as pd

(pd.DataFrame.from_dict(data=mydict, orient='index')
   .to_csv('dict_file.csv', header=False))

অ্যাকাউন্টে নেওয়ার মূল বিষয়টি হল 'ওরিয়েন্টাল' প্যারামিটারটিকে ' সূচীকরণের ' থেকে on_dict পদ্ধতির ভিতরে সেট করা । আপনি যদি নতুন সারিতে প্রতিটি অভিধান কী লিখতে চান তবে এটি আপনাকে চয়ন করতে দেয়।

সংযোজন, To_csv পদ্ধতির অভ্যন্তরে শিরোনাম পরামিতিগুলি বিরক্তিকর সারি ছাড়াই কেবল অভিধান উপাদান রাখতে ভুয়াতে সেট করা আছে। আপনি সর্বদা to_csv পদ্ধতির ভিতরে কলাম এবং সূচীর নামগুলি সেট করতে পারেন।

আপনার আউটপুটটি দেখতে এইরকম হবে:

key1,a
key2,b
key3,c

পরিবর্তে যদি আপনি চাবিগুলি কলামটির নাম হতে চান তবে কেবলমাত্র ডকুমেন্টেশন লিঙ্কগুলিতে চেক করতে পারায় ডিফল্ট 'ওরিয়েন্ট' প্যারামিটারটি 'কলামগুলি' ব্যবহার করুন।


4
দৃষ্টিনন্দনের মতো দুর্দান্ত কাজ করেছে :)। আমার মানটি একটি তালিকা ছিল এবং এটি একাধিক কক্ষের সমস্ত তালিকা মান সহ আমার সিএসভি উত্পন্ন করেছিল এবং প্রথম কলামে কীতে ম্যাপ করা হয়েছে।
ভিনসিনরাউ

14

সবচেয়ে সহজ উপায় হ'ল সিএসভি মডিউলটিকে উপেক্ষা করে এটিকে নিজে ফর্ম্যাট করা।

with open('my_file.csv', 'w') as f:
    [f.write('{0},{1}\n'.format(key, value)) for key, value in my_dict.items()]

8
যদি আপনার keyকমা পান তবে আপনার খুব খারাপ সময় কাটবে।
আলী আশরাফ

4
আমি কেবল এটি ব্যবহার করা সহজ বলে মনে করি csv.writer(...).writerows(my_dict.items())csvমডিউলটি কেবল কমা এবং নিউলাইনগুলি যুক্ত করার চেয়ে আরও অনেক কিছু করে।
মার্টিজন পিটারস

6
outfile = open( 'dict.txt', 'w' )
for key, value in sorted( mydict.items() ):
    outfile.write( str(key) + '\t' + str(value) + '\n' )

4
আপনার উত্তর সম্পর্কে কিছু তথ্য বা মন্তব্য প্রদান করুন।
এনডিএম

2

আপনি কি শুধু করতে পারেন:

for key in mydict.keys():
    f.write(str(key) + ":" + str(mydict[key]) + ",");

যাতে আপনি করতে পারেন

কী_1: মান_1, কী_2: মান_2


4
আরও ভাল হবে ','.join("%s:%s" % (k,v) for k,v in mydict.items())- ডিকের কীগুলি ও 'এন' মান অনুসন্ধানের চেয়ে আপনি ডিকের আইটেমগুলিতে পুনরাবৃত্তি করা ভাল, যা আপনাকে কী এবং মানগুলি একসাথে দেয়। ','.join(...)অতিরিক্ত ট্রেলিং কমা যুক্ত না করে শুধুমাত্র মানগুলির মধ্যে কমা রাখার যত্ন নেয়।
পলমিসজি

মনে রাখবেন যে এই অজগর
কোডটির

1

আমি ব্যক্তিগতভাবে সর্বদা সিএসভি মডিউলটি ধরণের বিরক্তিকর খুঁজে পেয়েছি। আমি প্রত্যাশা করি যে এটির সাথে কীভাবে চটজলদি করা যায় তা অন্য কেউ আপনাকে দেখায় তবে আমার দ্রুত এবং নোংরা সমাধানটি হল:

with open('dict.csv', 'w') as f:  # This creates the file object for the context 
                                  # below it and closes the file automatically
    l = []
    for k, v in mydict.iteritems(): # Iterate over items returning key, value tuples
        l.append('%s: %s' % (str(k), str(v))) # Build a nice list of strings
    f.write(', '.join(l))                     # Join that list of strings and write out

তবে আপনি যদি এটি আবার পড়তে চান তবে আপনার কিছু জ্বালাময় পার্সিং করা দরকার, বিশেষত যদি এটি সমস্ত এক লাইনে থাকে। আপনার প্রস্তাবিত ফাইল ফর্ম্যাটটি ব্যবহার করে এখানে একটি উদাহরণ দেওয়া আছে।

with open('dict.csv', 'r') as f: # Again temporary file for reading
    d = {}
    l = f.read().split(',')      # Split using commas
    for i in l:
        values = i.split(': ')   # Split using ': '
        d[values[0]] = values[1] # Any type conversion will need to happen here

আমি রিকার্ডোর উত্তর নিয়ে যাব। অথবা কমপক্ষে পৃথক লাইন ব্যবহার করুন।
গ্রিফিথ রিস

0
import csv

dict = {"Key Header":"Value Header", "key1":"value1", "key2":"value2"}

with open("test.csv", "w") as f:
    writer = csv.writer(f)
    for i in dict:
      writer.writerow([i, dict[i]])
f.close() 

এখানে চিত্র বর্ণনা লিখুন


আমি মনে করি না আপনাকে শেষ লাইনে সুস্পষ্টভাবে ফাইলটি বন্ধ করতে হবে। প্রসঙ্গ পরিচালক আপনার জন্য এটি করে does
avaj_wen12

0
#code to insert and read dictionary element from csv file
import csv
n=input("Enter I to insert or S to read : ")
if n=="I":
    m=int(input("Enter the number of data you want to insert: "))
    mydict={}
    list=[]
    for i in range(m):
        keys=int(input("Enter id :"))
        list.append(keys)
        values=input("Enter Name :")
        mydict[keys]=values

    with open('File1.csv',"w") as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=list)
        writer.writeheader()
        writer.writerow(mydict)
        print("Data Inserted")
else:
    keys=input("Enter Id to Search :")
    Id=str(keys)
    with open('File1.csv',"r") as csvfile:
        reader = csv.DictReader(csvfile)
        for row in reader:
            print(row[Id]) #print(row) to display all data

আপনি যদি কিছুটা ব্যাখ্যা যোগ করেন তবে এটি আরও ভাল হবে
রোয়াইম

-2

আপনি কি "এস" চালু করার চেষ্টা করেছেন: w.writerow(mydict)এই জাতীয় w.writerows(mydict):? এই সমস্যাটি আমার সাথে ঘটেছিল তবে তালিকাগুলি সহ আমি বহুবচনের পরিবর্তে একক ব্যবহার করছিলাম।

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