software - python tutorial




फ़ाइल को txt करने और इसे वापस पढ़ने के लिए एक dict लिखना? (4)

आप कुंजी-मूल्य जोड़ी के माध्यम से पुनरावृत्त कर सकते हैं और इसे फ़ाइल में लिख सकते हैं

pair = {'name': name,'location': location}
with open('F:\\twitter.json', 'a') as f:
     f.writelines('{}:{}'.format(k,v) for k, v in pair.items())
     f.write('\n')

मैं एक txt फ़ाइल में एक शब्दकोश लिखने की कोशिश कर रहा हूँ। फिर raw_input साथ कुंजी टाइप करके dict मानों को raw_input । मुझे लगता है कि मैं सिर्फ एक कदम लापता हूं लेकिन मैं थोड़ी देर के लिए देख रहा हूं।

मुझे यह त्रुटि मिलती है

File "name.py", line 24, in reading
    print whip[name]
TypeError: string indices must be integers, not str

मेरा कोड:

#!/usr/bin/env python
from sys import exit

class Person(object):
    def __init__(self):
        self.name = ""
        self.address = ""
        self.phone = ""
        self.age = ""
        self.whip = {}

    def writing(self):
        self.whip[p.name] = p.age, p.address, p.phone
        target = open('deed.txt', 'a')
        target.write(str(self.whip))
        print self.whip

    def reading(self):
        self.whip = open('deed.txt', 'r').read()
        name = raw_input("> ")
        if name in self.whip:
            print self.whip[name]

p = Person()

while True:
    print "Type:\n\t*read to read data base\n\t*write to write to data base\n\t*exit to exit"
    action = raw_input("\n> ")
    if "write" in action:
        p.name = raw_input("Name?\n> ")
        p.phone = raw_input("Phone Number?\n> ")
        p.age = raw_input("Age?\n> ")
        p.address = raw_input("Address?\n>")
        p.writing()
    elif "read" in action:
        p.reading()
    elif "exit" in action:
        exit(0)

आपका कोड लगभग सही है ! आप सही हैं, आप बस एक कदम लापता हैं। जब आप फ़ाइल में पढ़ते हैं, तो आप इसे एक स्ट्रिंग के रूप में पढ़ रहे हैं; लेकिन आप स्ट्रिंग को वापस एक शब्दकोश में बदलना चाहते हैं।

आपके द्वारा देखा गया त्रुटि संदेश था क्योंकि self.whip एक स्ट्रिंग था, न कि शब्दकोश।

मैंने पहली बार लिखा था कि आप केवल स्ट्रिंग को dict() में खिला सकते हैं लेकिन यह काम नहीं करता है! आपको कुछ और करने की ज़रूरत है।

उदाहरण

यहां सबसे आसान तरीका है: स्ट्रिंग को eval() में फ़ीड करें। इस तरह:

def reading(self):
    s = open('deed.txt', 'r').read()
    self.whip = eval(s)

आप इसे एक पंक्ति में कर सकते हैं, लेकिन मुझे लगता है कि यह इस तरह गन्दा दिखता है:

def reading(self):
    self.whip = eval(open('deed.txt', 'r').read())

लेकिन eval() कभी-कभी अनुशंसित नहीं है। समस्या यह है कि eval() किसी भी स्ट्रिंग का मूल्यांकन करेगा, और अगर किसी ने आपको वास्तव में मुश्किल स्ट्रिंग चलाने में धोखा दिया है, तो कुछ बुरा हो सकता है। इस मामले में, आप बस अपनी फाइल पर eval() चला रहे हैं, इसलिए यह ठीक होना चाहिए।

लेकिन क्योंकि eval() उपयोगी है, किसी ने इसका विकल्प बनाया जो सुरक्षित है। इसे literal_eval कहा जाता है और आप इसे literal_eval नामक पायथन मॉड्यूल से प्राप्त करते हैं।

import ast

def reading(self):
    s = open('deed.txt', 'r').read()
    self.whip = ast.literal_eval(s)

ast.literal_eval() केवल स्ट्रिंग का मूल्यांकन करेगा जो मूल पायथन प्रकारों में बदल जाता है, इसलिए कोई तरीका नहीं है कि एक मुश्किल स्ट्रिंग आपके कंप्यूटर पर कुछ खराब कर सकती है।

संपादित करें

असल में, पाइथन में सबसे अच्छा अभ्यास यह सुनिश्चित करने के लिए एक बयान का उपयोग करना है कि फ़ाइल ठीक से बंद हो जाए। एक कथन का उपयोग करने के लिए उपरोक्त को पुनर्लेखन:

import ast

def reading(self):
    with open('deed.txt', 'r') as f:
        s = f.read()
        self.whip = ast.literal_eval(s)

सबसे लोकप्रिय पायथन में, जिसे "सीपीथन" के नाम से जाना जाता है, आपको आम तौर पर अंतर्निहित कथन की आवश्यकता नहीं होती है क्योंकि अंतर्निर्मित "कचरा संग्रह" सुविधाओं का पता लगाया जाएगा कि आप फ़ाइल के साथ किए गए हैं और इसे आपके लिए बंद कर देंगे। लेकिन अन्य पायथन कार्यान्वयन, जैसे "ज्योथन" (जावा वीएम के लिए पायथन) या "पीपीपी" (केवल समय-समय पर कोड ऑप्टिमाइज़ेशन के साथ एक बहुत ही अच्छा प्रयोगात्मक प्रणाली) आपके लिए फ़ाइल को बंद करने के लिए नहीं समझ सकता है। इसका उपयोग करने की आदत में होना अच्छा with , और मुझे लगता है कि यह कोड को समझने में बहुत आसान बनाता है।


नमस्ते फ़ाइल को लिखने और पढ़ने के लिए एक तरीका है, आप अपने शब्दकोश को JSON प्रारूप में बदल सकते हैं और तुरंत पढ़ सकते हैं और लिख सकते हैं:

अपनी तिथि लिखने के लिए:

 import json

 your_dictionary = {"some_date" : "date"}
 f = open('destFile.txt', 'w+')
 f.write(json.dumps(yout_dictionary))

और अपना डेटा पढ़ने के लिए:

 import json

 f = open('destFile.txt', 'r')
 your_dictionary = json.loads(f.read())

फ़ाइलों में पायथन वस्तुओं को स्टोर करने के लिए, pickle मॉड्यूल का उपयोग करें:

import pickle

a = {
  'a': 1,
  'b': 2
}

with open('file.txt', 'wb') as handle:
  pickle.dump(a, handle)

with open('file.txt', 'rb') as handle:
  b = pickle.loads(handle.read())

print a == b # True

ध्यान दें कि मैंने कभी भी b = a सेट नहीं किया b = a , लेकिन इसके बजाय एक फ़ाइल को चुना है और फिर इसे b में अनपिक किया है।

आपकी त्रुटि के लिए:

self.whip = open('deed.txt', 'r').read()

self.whip एक शब्दकोश वस्तु थी। deed.txt में टेक्स्ट होता है, इसलिए जब आप deed.txt में self.whip की सामग्री लोड करते हैं, तो self.whip स्वयं का स्ट्रिंग प्रस्तुति बन जाता है।

आप स्ट्रिंग को पाइथन ऑब्जेक्ट में वापस मूल्यांकन करना चाहते हैं:

self.whip = eval(open('deed.txt', 'r').read())

ध्यान दें कि evil तरह कैसे eval लगता evil । यह जानबूझकर है। इसके बजाय pickle मॉड्यूल का प्रयोग करें।





python