কোনও ফাইলকে অভিধানে রূপান্তর করবেন কীভাবে?


95

আমার কাছে দুটি কলাম সমন্বিত একটি ফাইল রয়েছে, যেমন,

1 a 
2 b 
3 c

আমি এই ফাইলটি একটি অভিধানে পড়তে চাই যেমন কলাম 1 এর মূল এবং কলাম 2 এর মান, অর্থাত,

d = {1:'a', 2:'b', 3:'c'}

ফাইলটি ছোট, তাই দক্ষতা কোনও সমস্যা নয়।

উত্তর:


157
d = {}
with open("file.txt") as f:
    for line in f:
       (key, val) = line.split()
       d[int(key)] = val

4
আপনি বিবৃতি দিয়ে ব্যাখ্যা করতে পারেন?
ভিজিই

12
withফাইলটি পরিষ্কার করার জন্য এখানে ব্যবহার করা হয়। আপনি যখন ব্লকটি ছেড়ে যান (হয় কেবলমাত্র সাধারণ সম্পাদন প্রবাহের মাধ্যমে বা কোনও ব্যতিক্রম দ্বারা) সেখানে ফাইল স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে। পাইথনের কনটেক্সট-ম্যানেজারদের সম্পর্কে আপনি এখানে আরও পড়তে পারেন: effbot.org/zone/python-with-statement.htm
ভ্লাদ এইচ

4
for line in open("file.txt"):একইভাবে পরিষ্কার করুন এবং যদি চ এর স্থানীয় মান হয় fতবে সুযোগটি হারাতে হবে। কেবলমাত্র এই বিবৃতিটি কার্যকর তা দীর্ঘ ফাংশনের জন্য (মানের পক্ষে ভাল নয়), বা আপনি যদি বিশ্বব্যাপী পরিবর্তনশীল ব্যবহার করেন।
ভিজিই

4
@ VGE, একইভাবে ক্লিনআপ for line in open('file.txt')করবেন না । সমস্ত পাইথন বাস্তবায়ন একরকম নয়। withগ্যারান্টি দেয় ফাইলটি বন্ধ হয়ে যাবে যখন ব্লকটি প্রস্থান করা হবে। forলাইনটি সম্পূর্ণ হয়ে গেলে , ডাকা close হতে পারে। CPythonএটি হবে তবে সংস্করণগুলির মতো IronPythonঅলস আবর্জনা সংগ্রহকারী রয়েছে।
মার্ক টোলোনেন

4
এখানে আসলেই কি প্রয়োজনীয়? সম্ভবত তিনি সংখ্যাটি স্ট্রিং হতে চেয়েছিলেন?
GL2014

15

এটি কীটিকে স্ট্রিং হিসাবে ছেড়ে দেবে:

with open('infile.txt') as f:
  d = dict(x.rstrip().split(None, 1) for x in f)

4
একটি সহজ dict([line.split() for line in f])যথেষ্ট, কিন্তু।
user225312

@ সুখবীর: আপনি যদি প্রশ্নটি পড়েন তবে দেখবেন যে ওপি যা চায় তা নয়।
সাইলেন্টগোস্ট

@ সাইলেন্টগোস্ট: আমি পড়েছি যে ওপি পূর্ণসংখ্যা হিসাবে কীগুলি চায়, তবে ইগনাসিওর সমাধান (পাশাপাশি আমি মুছে ফেলাও) এর একটি স্ট্রিং (যেমন ইগনাসিও নিজেই নির্দেশ করেছেন) হিসাবে কী রয়েছে।
user225312

ডিক যুক্তিতে পাস করার সময় কেন আমাদের [[] দরকার নেই তা আমি বিভ্রান্ত হয়ে পড়েছিলাম। অর্থাত্ dict([x.rstrip().split(None, 1) for x in f])পরিবর্তে dict(x.rstrip().split(None, 1) for x in f)। যারা একই জিনিসটি চিন্তা করে তাদের জন্য, পূর্বেরটি এখানে বর্ণিত তালিকা অনুধাবনের পরিবর্তে একটি জেনারেটর এক্সপ্রেশন: পাইথন.আর / ডেভিড / পেপস / পেপ ০২৯৯৯৯৯ পিইপি ২৯৯) । নতুন কিছু শিখেছি!
পিক্সোল

4
@ পেকসোল: মধ্যবর্তী তালিকা তৈরি না করার জন্য আমরা একটি তালিকা বোধের পরিবর্তে একটি জেনারেটর এক্সপ্রেশন ব্যবহার করি।
Ignacio Vazquez-Abram


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

4
কেন না partition? এবং withবিবৃতি?
সাইলেন্টগোস্ট

@ সাইলেন্টগোস্ট: বিভাজন সম্পর্কে আমি জানতাম না! তবে কেন এই ক্ষেত্রে স্ট্রিংস্প্লিট করা ভাল? "সাথে" সম্পর্কিত: সম্ভবত আপনি আমার জন্য এটি পরিষ্কার করতে পারেন: ফাইল বিবরণকারী বন্ধ হওয়ার সুযোগের বাইরে যাওয়া কি যথেষ্ট নয়? আমার ধারণা একটি ব্যতিক্রম হিসাবে ফাইলের মূল খোলা থাকবে, আমি এটি পরিবর্তন করব।
টোকল্যান্ড

partitionদ্রুত এবং ঠিক এই উদ্দেশ্যে তৈরি করা হয়।
সাইলেন্টগোস্ট

বর্ণনাকারী বন্ধ আছে কিনা তা বাস্তবায়নের বিশদ। withএটি নিশ্চিত করার একটি সহজ উপায়।
সাইলেন্টগোস্ট

এটি এখনও প্রয়োজন হবে strip, আমি বলব।
সাইলেন্টগোস্ট

3

অভিধান বোঝার দ্বারা

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]

পান্ডাস দ্বারা কেবল প্রথম কলামটি নেয়
মৌলিক মাধবী

4
@ সমার আইয়ুব উপরের সমাধান (অভিধান বোঝা) কাজ করে যদি কী এবং মান উভয়ই এক শব্দ দীর্ঘ হয়। যদি আমার পাঠ্য ফাইলে নিম্নলিখিত ডেটা থাকে I কীভাবে কী কী বছর এবং বিজয়ী দলকে মান হিসাবে তৈরি করব। 1903 বোস্টন আমেরিকান 1904 ন ওয়ার্ল্ড সিরিজ 1905 নিউ ইয়র্ক জায়ান্টস 1906 শিকাগো হোয়াইট সক্স 1907 শিকাগো শাবস 1908 শিকাগো কিউবস
রিধি

4
@ রিধি বিচলিত উত্তরের জন্য দুঃখিত আপনি হয় কেবল প্রথম স্থানটিতে বিভক্ত করতে পারেন কেবল স্ট্যাকওভারফ্লো / সিকিউশনস / 30636248/… বা বিভাজনের পক্ষে যুক্তি হিসাবে নিয়মিত অভিব্যক্তিটি ব্যবহার করুন ()
সামের আইয়ুব

@ সমীরআউউব- আপনাকে ধন্যবাদ
রিদ্ধি

1

জেনারেটর ব্যবহার করতে আরও কিছু অজগর আইএমএইচও করুন (সম্ভবত এটির জন্য আপনার 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()}

এটি কোনও পূর্ণসংখ্যার সাথে শুরু না হওয়া বা ঠিক দুটি আইটেম না থাকা লাইনগুলিও ফিল্টার করবে


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

9
re? গুরুত্ব সহকারে?
সাইলেন্টগোস্ট

আমি মনে করি না এটি সর্বোত্তম পন্থা।
ডোনভান

@ সিফয়েড বলেছিলেন "ফাইলটি ছোট, তাই দক্ষতা কোনও সমস্যা নয়।" split()ফাইল ফর্ম্যাটটি বুদ্ধিমান না হলে প্রায় নিঃশব্দে কাজ করে না।
ভিজিই

0

আপনি যদি একটি লাইনার পছন্দ করেন তবে চেষ্টা করুন:

d=eval('{'+re.sub('\'[\s]*?\'','\':\'',re.sub(r'([^'+input('SEP: ')+',]+)','\''+r'\1'+'\'',open(input('FILE: ')).read().rstrip('\n').replace('\n',',')))+'}')

ইনপুট ফাইল = ফাইলের পথে, এসইপি = কী-মান বিভাজক অক্ষর

এটি করার জন্য সবচেয়ে মার্জিত বা দক্ষ উপায় নয়, তবে বেশ আকর্ষণীয় তবেই :)



0

সরল অপশন

অভিধান সংরক্ষণের বেশিরভাগ পদ্ধতিতে জেএসএন, পিকেল বা লাইন রিডিং ব্যবহার করা হয়। আপনি পাইথনের বাইরে অভিধান সম্পাদনা করছেন না এমনটি প্রদান করে, এই সহজ পদ্ধতিটি এমনকি জটিল অভিধানের জন্য যথেষ্ট। যদিও পিকল বৃহত্তর অভিধানের জন্য আরও ভাল হবে।

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

0

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

d = {}
file = open("filename.txt")
for x in file:
    f = x.split("=")
    d.update({f[0].strip(): f[1].strip()})

স্ট্রিপ পদ্ধতি ব্যবহার করে "=" বিভাজক সরানোর আগে বা পরে কোনও ফাঁকা জায়গা ব্যবহার করা হবে এবং আপনার অভিধানের বিন্যাসে প্রত্যাশিত ডেটা থাকবে


হাই, ওভারফ্লো স্ট্যাক আপনাকে স্বাগতম! আপনার দৃষ্টিভঙ্গি অন্য ব্যবহারকারীর থেকে পৃথক, তবে =প্রশ্নের উত্তর দেওয়ার জন্য আপনি কি এটি একটি `with এর সাথে প্রতিস্থাপন করতে সম্পাদনা করতে পারবেন ?
প্রুনাস পার্সিকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.