আমার কাছে দুটি কলাম সমন্বিত একটি ফাইল রয়েছে, যেমন,
1 a
2 b
3 c
আমি এই ফাইলটি একটি অভিধানে পড়তে চাই যেমন কলাম 1 এর মূল এবং কলাম 2 এর মান, অর্থাত,
d = {1:'a', 2:'b', 3:'c'}
ফাইলটি ছোট, তাই দক্ষতা কোনও সমস্যা নয়।
আমার কাছে দুটি কলাম সমন্বিত একটি ফাইল রয়েছে, যেমন,
1 a
2 b
3 c
আমি এই ফাইলটি একটি অভিধানে পড়তে চাই যেমন কলাম 1 এর মূল এবং কলাম 2 এর মান, অর্থাত,
d = {1:'a', 2:'b', 3:'c'}
ফাইলটি ছোট, তাই দক্ষতা কোনও সমস্যা নয়।
উত্তর:
d = {}
with open("file.txt") as f:
for line in f:
(key, val) = line.split()
d[int(key)] = val
with
ফাইলটি পরিষ্কার করার জন্য এখানে ব্যবহার করা হয়। আপনি যখন ব্লকটি ছেড়ে যান (হয় কেবলমাত্র সাধারণ সম্পাদন প্রবাহের মাধ্যমে বা কোনও ব্যতিক্রম দ্বারা) সেখানে ফাইল স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে। পাইথনের কনটেক্সট-ম্যানেজারদের সম্পর্কে আপনি এখানে আরও পড়তে পারেন: effbot.org/zone/python-with-statement.htm
for line in open("file.txt"):
একইভাবে পরিষ্কার করুন এবং যদি চ এর স্থানীয় মান হয় f
তবে সুযোগটি হারাতে হবে। কেবলমাত্র এই বিবৃতিটি কার্যকর তা দীর্ঘ ফাংশনের জন্য (মানের পক্ষে ভাল নয়), বা আপনি যদি বিশ্বব্যাপী পরিবর্তনশীল ব্যবহার করেন।
for line in open('file.txt')
করবেন না । সমস্ত পাইথন বাস্তবায়ন একরকম নয়। with
গ্যারান্টি দেয় ফাইলটি বন্ধ হয়ে যাবে যখন ব্লকটি প্রস্থান করা হবে। for
লাইনটি সম্পূর্ণ হয়ে গেলে , ডাকা close
হতে পারে। CPython
এটি হবে তবে সংস্করণগুলির মতো IronPython
অলস আবর্জনা সংগ্রহকারী রয়েছে।
এটি কীটিকে স্ট্রিং হিসাবে ছেড়ে দেবে:
with open('infile.txt') as f:
d = dict(x.rstrip().split(None, 1) for x in f)
dict([line.split() for line in f])
যথেষ্ট, কিন্তু।
dict([x.rstrip().split(None, 1) for x in f])
পরিবর্তে dict(x.rstrip().split(None, 1) for x in f)
। যারা একই জিনিসটি চিন্তা করে তাদের জন্য, পূর্বেরটি এখানে বর্ণিত তালিকা অনুধাবনের পরিবর্তে একটি জেনারেটর এক্সপ্রেশন: পাইথন.আর / ডেভিড / পেপস / পেপ ০২৯৯৯৯৯ পিইপি ২৯৯) । নতুন কিছু শিখেছি!
আপনি ডিক বোধগম্যতা ব্যবহার করতে পারেন:
with open("infile.txt") as f:
d = {int(k): v for line in f for (k, v) in [line.strip().split(None, 1)]}
def get_pair(line):
key, sep, value = line.strip().partition(" ")
return int(key), value
with open("file.txt") as fd:
d = dict(get_pair(line) for line in fd)
partition
? এবং with
বিবৃতি?
partition
দ্রুত এবং ঠিক এই উদ্দেশ্যে তৈরি করা হয়।
with
এটি নিশ্চিত করার একটি সহজ উপায়।
strip
, আমি বলব।
অভিধান বোঝার দ্বারা
d = { line.split()[0] : line.split()[1] for line in open("file.txt") }
বা পান্ডাস দ্বারা
import pandas as pd
d = pd.read_csv("file.txt", delimiter=" ", header = None).to_dict()[0]
জেনারেটর ব্যবহার করতে আরও কিছু অজগর আইএমএইচও করুন (সম্ভবত এটির জন্য আপনার 2.7+ প্রয়োজন):
with open('infile.txt') as fd:
pairs = (line.split(None) for line in fd)
res = {int(pair[0]):pair[1] for pair in pairs if len(pair) == 2 and pair[0].isdigit()}
এটি কোনও পূর্ণসংখ্যার সাথে শুরু না হওয়া বা ঠিক দুটি আইটেম না থাকা লাইনগুলিও ফিল্টার করবে
import re
my_file = open('file.txt','r')
d = {}
for i in my_file:
g = re.search(r'(\d+)\s+(.*)', i) # glob line containing an int and a string
d[int(g.group(1))] = g.group(2)
re
? গুরুত্ব সহকারে?
split()
ফাইল ফর্ম্যাটটি বুদ্ধিমান না হলে প্রায় নিঃশব্দে কাজ করে না।
আপনি যদি একটি লাইনার পছন্দ করেন তবে চেষ্টা করুন:
d=eval('{'+re.sub('\'[\s]*?\'','\':\'',re.sub(r'([^'+input('SEP: ')+',]+)','\''+r'\1'+'\'',open(input('FILE: ')).read().rstrip('\n').replace('\n',',')))+'}')
ইনপুট ফাইল = ফাইলের পথে, এসইপি = কী-মান বিভাজক অক্ষর
এটি করার জন্য সবচেয়ে মার্জিত বা দক্ষ উপায় নয়, তবে বেশ আকর্ষণীয় তবেই :)
এখানে আরও একটি বিকল্প ...
events = {}
for line in csv.reader(open(os.path.join(path, 'events.txt'), "rb")):
if line[0][0] == "#":
continue
events[line[0]] = line[1] if len(line) == 2 else line[1:]
অভিধান সংরক্ষণের বেশিরভাগ পদ্ধতিতে জেএসএন, পিকেল বা লাইন রিডিং ব্যবহার করা হয়। আপনি পাইথনের বাইরে অভিধান সম্পাদনা করছেন না এমনটি প্রদান করে, এই সহজ পদ্ধতিটি এমনকি জটিল অভিধানের জন্য যথেষ্ট। যদিও পিকল বৃহত্তর অভিধানের জন্য আরও ভাল হবে।
x = {1:'a', 2:'b', 3:'c'}
f = 'file.txt'
print(x, file=open(f,'w')) # file.txt >>> {1:'a', 2:'b', 3:'c'}
y = eval(open(f,'r').read())
print(x==y) # >>> True
আমার পাঠ্য ফাইল থেকে মান গ্রহণ এবং কী মান জোড় হিসাবে ব্যবহার করার প্রয়োজন ছিল। আমার কাছে টেক্সট ফাইলে কী = মান হিসাবে সামগ্রী রয়েছে, তাই আমি বিভাজককে "=" হিসাবে বিভক্ত পদ্ধতি ব্যবহার করেছি এবং নীচে কোডটি লিখেছি
d = {}
file = open("filename.txt")
for x in file:
f = x.split("=")
d.update({f[0].strip(): f[1].strip()})
স্ট্রিপ পদ্ধতি ব্যবহার করে "=" বিভাজক সরানোর আগে বা পরে কোনও ফাঁকা জায়গা ব্যবহার করা হবে এবং আপনার অভিধানের বিন্যাসে প্রত্যাশিত ডেটা থাকবে
=
প্রশ্নের উত্তর দেওয়ার জন্য আপনি কি এটি একটি `with এর সাথে প্রতিস্থাপন করতে সম্পাদনা করতে পারবেন ?