मेरे पास एक फाइल है जिसमें दो कॉलम हैं, यानी
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 एक स्थानीय मान 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)
। एक ही बात को सोचने वालों के लिए, पूर्व सूची बोध के बजाय एक जनरेटर अभिव्यक्ति है जैसा कि यहां बताया गया है: python.org/dev/peps/pep-0289(PEP-289) । कुछ नया सीखा!
यदि आपका अजगर संस्करण 2.7+ है, तो आप एक तानाशाह की समझ का उपयोग भी कर सकते हैं:
with open('infile.txt') as f:
{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]
IMHO जनरेटर का उपयोग करने के लिए थोड़ा अधिक पायथोनिक है (शायद आपको इसके लिए 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:]
शब्दकोश का उपयोग करने के लिए अधिकांश तरीके JSON, अचार या लाइन रीडिंग का उपयोग करते हैं। बशर्ते आप पायथन से बाहर के शब्दकोश का संपादन नहीं कर रहे हैं, इस सरल विधि को और भी जटिल शब्दकोशों के लिए पर्याप्त होना चाहिए। हालांकि अचार बड़े शब्दकोशों के लिए बेहतर होगा।
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