একটি পাঠ্য ফাইলে অভিধান লিখছেন?


96

আমার একটি অভিধান আছে এবং এটি একটি ফাইলে লেখার চেষ্টা করছি।

exDict = {1:1, 2:2, 3:3}
with open('file.txt', 'r') as file:
    file.write(exDict)

আমার তখন ত্রুটি আছে

file.write(exDict)
TypeError: must be str, not dict

সুতরাং আমি সেই ত্রুটিটি স্থির করেছি তবে অন্য একটি ত্রুটি এসেছিল

exDict = {111:111, 222:222}
with open('file.txt', 'r') as file:
    file.write(str(exDict))

ভূল:

file.write(str(exDict))
io.UnsupportedOperation: not writable

অজগরটির আমি এখনও শিক্ষানবিস হিসাবে কী করব তা আমার কোনও ধারণা নেই। কেউ যদি সমস্যাটি সমাধান করতে জানেন তবে দয়া করে একটি উত্তর দিন।

দ্রষ্টব্য: আমি পাইথন 3 ব্যবহার করছি, পাইথন 2 নয়

উত্তর:


154

সবার আগে আপনি ফাইলটি রিড মোডে খুলছেন এবং এতে লেখার চেষ্টা করছেন। পরামর্শ - আইও মোড অজগর

দ্বিতীয়ত, আপনি কেবল একটি ফাইলটিতে স্ট্রিং লিখতে পারেন। আপনি যদি কোনও অভিধান অবজেক্ট লিখতে চান তবে আপনাকে এটি স্ট্রিংয়ে রূপান্তর করতে হবে বা এটি সিরিয়ালায়িত করতে হবে।

import json

# as requested in comment
exDict = {'exDict': exDict}

with open('file.txt', 'w') as file:
     file.write(json.dumps(exDict)) # use `json.loads` to do the reverse

সিরিয়ালাইজেশন ক্ষেত্রে

import cPickle as pickle

with open('file.txt', 'w') as file:
     file.write(pickle.dumps(exDict)) # use `pickle.loads` to do the reverse

পাইথন ৩.x এর জন্য আচার প্যাকেজ আমদানি আলাদা হবে

import _pickle as pickle

4
যে কাজ! যদিও এটি কেবল অভিধানের লিখিত বিষয়বস্তু লিখেছে। আপনি কি এটি লিখতে পেতে পারেন: exDict = {111: 111, 222: 222}
নিক

আমি এটি ভেবেছিলাম তবে ভেবেছিলাম এর থেকে আরও ভাল উপায় আছে। যদিও এটি আপনাকে ধন্যবাদ ধন্যবাদ!
নিক

আপনি যদি =সাইন দিয়ে খুব বেশি সংযুক্ত না হন তবে আমি সম্পাদনাটি সম্ভবত কাজটি করতে পারে।
hspandher

আপনার আগে যেভাবে এটি ছিল: ফাইল.উরাইট ('এক্সডিক্ট =' + জসন.ডাম্পস (এক্সডিক্ট)) আমার পক্ষে ঠিক কাজ করেছে যেহেতু এখনই এটি ব্যবহার করছি।
নিক

4
@ জনকুকাকা জেএসএন একটি স্ট্যান্ডার্ড ডেটা ফর্ম্যাট। যা str(exDict)উত্পাদন করবে তা সর্বদা বৈধ JSON হবে না। আমার মাথার পেছনের দিক থেকে একটি কারণ হ'ল একক উক্তিগুলি JSON ফাইলে বৈধ নয়, যখন আমরা strপদ্ধতিটি ব্যবহার করি তখন উপস্থিত থাকতে পারে ।
hspandher

50

আমি অজগর 3 এ এটি করি:

with open('myfile.txt', 'w') as f:
    print(mydictionary, file=f)

4
আমি এটি পছন্দ করি কারণ প্রয়োজনীয় কোনও আমদানি নেই। উপরের উত্তর ডেটা. রাইটিং (স্ট্রিং (অভিধান)) একটি সঠিক অভিধানের সাথে কাজ করবে না কারণ এটি কেবল আপনার ফাইলে <ক্লাস 'ডিক্ট>> লিখবে
সি সোম

একটি বিষয় যা আমি আগ্রহী তা হ'ল কেন কেবল মুদ্রণ করবেন না (মাইডিক অভিধান, ফাইল = উন্মুক্ত ('মাইফাইল.টিএসটি', '
ডাব্লু

@ ম্যাডম্যানলি আমি মনে করি উভয়ই ঠিক আছে এবং আমরা আমাদের কোডটি কেমন দেখতে পছন্দ করি তা বিষয়।
NKSHLL

4
ওপেন ('মাইফাইল.টেক্সট', 'আর') হিসাবে এফ: সামগ্রী = f.read (); dic = eval (বিষয়বস্তু);
NKSHELL

জসন কেবল str(mydict)একটি ফাইলে লেখার চেয়ে ভাল হওয়ার কারণ হ'ল অবজেক্টটি ফিরে evalপেতে আপনার সামগ্রীগুলির প্রয়োজন হবে না dictevalএটি একটি সুরক্ষা রস্ক এবং আরও ভাল বিকল্প উপলব্ধ থাকলে ব্যবহার করা উচিত নয়।
snakecharmerb

23
fout = "/your/outfile/here.txt"
fo = open(fout, "w")

for k, v in yourDictionary.items():
    fo.write(str(k) + ' >>> '+ str(v) + '\n\n')

fo.close()

12
কোড-কেবল উত্তরগুলি নিরুৎসাহিত করা হয়েছে কারণ তারা কীভাবে সমস্যাটি সমাধান করে তা ব্যাখ্যা করে না। এই প্রশ্নটি ইতিমধ্যে অন্যান্য স্বীকৃত এবং আপত্তিকৃত উত্তরে কীভাবে এটি উন্নতি করে তা বোঝাতে আপনার উত্তর আপডেট করুন। দয়া করে পর্যালোচনা করুন আমি কীভাবে একটি ভাল উত্তর লিখি
ফ্লফিকিটেন

এছাড়াও, withফাইলগুলি থেকে পড়া এবং লেখার সময় আপনার বিবৃতিটি ব্যবহার করা উচিত : stackoverflow.com/questions/3012488/…
ফ্যালকো

13

আপনার প্রথম কোড ব্লকের প্রবাদটি হ'ল আপনি ফাইলটি 'আর' হিসাবে খোলার পরেও আপনি এটি ব্যবহার করে লিখতে চেয়েছিলেন 'w'

with open('/Users/your/path/foo','w') as data:
    data.write(str(dictionary))

এটি সঠিক উত্তর, যেহেতু প্রশ্নের মধ্যে কোডটিতে একটি ত্রুটি রয়েছে।
রিকার্ডো রিভালদো

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

7

আপনি যদি একটি অভিধান চান তবে আপনি নাম থেকে কোনও ফাইল থেকে আমদানি করতে পারেন, এবং সেই সাথে ভালভাবে বাছাই করা এন্ট্রি যুক্ত করে এবং আপনি সংরক্ষণ করতে চান এমন স্ট্রিং রয়েছে, আপনি এটি চেষ্টা করতে পারেন:

data = {'A': 'a', 'B': 'b', }

with open('file.py','w') as file:
    file.write("dictionary_name = { \n")
    for k in sorted (data.keys()):
        file.write("'%s':'%s', \n" % (k, data[k]))
    file.write("}")

তারপরে আমদানি করতে:

from file import dictionary_name

এটি কেবল স্ট্রিংয়ের জন্য কাজ করে, অভিধানে অন্য ধরণের নয়।
পল কেনজোরা 18

4

তালিকা বোঝাপড়া প্রেমীদের জন্য, এটি key : valueনতুন জোরে সমস্ত জোড় লিখবেdog.txt

my_dict = {'foo': [1,2], 'bar':[3,4]}

# create list of strings
list_of_strings = [ f'{key} : {my_dict[key]}' for key in my_dict ]

# write string one by one adding newline
with open('dog.txt', 'w') as my_file:
    [ my_file.write(f'{st}\n') for st in list_of_strings ]

1

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

import pandas as pd
one_line_dict = exDict = {1:1, 2:2, 3:3}
df = pd.DataFrame.from_dict([one_line_dict])
df.to_csv('file.txt', header=False, index=True, mode='a')

আমি আশা করি এটি সাহায্য করতে পারে।


4
একটি সাধারণ কাজের জন্য কেন একটি বাহ্যিক গ্রন্থাগার ব্যবহার করবেন? পাইথন সিম্পল আরও ভাল নীতি।
রিকার্ডো রিভালদো

খুব কার্যকর নয় কারণ আমি ব্যবহার করি বেশিরভাগ অভিধানগুলি দরকারী ডেটা ফ্রেম অবজেক্টে পরিণত হওয়ার পক্ষে সহজ নয়।
pauljohn32



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