programing

dict to txt 파일을 쓰고 다시 읽는 중?

subpage 2023. 8. 17. 21:20
반응형

dict to txt 파일을 쓰고 다시 읽는 중?

나는 txt 파일에 사전을 쓰려고 합니다.그런 다음 다음 키를 입력하여 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)

json 모듈을 사용해 보셨습니까?JSON 형식은 파이썬 사전과 매우 유사합니다.그리고 사람이 읽을 수 있고 쓸 수 있습니다.

>>> import json
>>> d = {"one":1, "two":2}
>>> json.dump(d, open("text.txt",'w'))

이 코드는 텍스트 파일로 덤프됩니다.

$ cat text.txt 
{"two": 2, "one": 1}

JSON 파일에서 로드할 수도 있습니다.

>>> d2 = json.load(open("text.txt"))
>>> print d2
{u'two': 2, u'one': 1}

코드가 거의 맞습니다!맞아요, 한 발짝도 헛디뎌서 그래요.파일을 읽을 때 문자열로 읽지만 문자열을 사전으로 되돌리려고 합니다.

당신이 본 오류 메시지는 다음과 같습니다.self.whip사전이 아니라 문자열이었습니다.따라서 문자열을 사전으로 변환해야 합니다.

가장 간단한 방법은 다음과 같습니다. 문자열을 입력합니다.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그리고 당신은 그것을 파이썬 모듈에서 얻습니다.ast.

import ast

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

ast.literal_eval()기본 Python 유형으로 변환되는 문자열만 평가하므로 까다로운 문자열이 컴퓨터에서 나쁜 결과를 초래할 수 없습니다.

편집

사실 Python의 모범 사례는 다음을 사용하는 것입니다.with파일이 제대로 닫히는지 확인하는 문입니다.를 사용하기 위해 위에 다시 쓰기with문:

import ast

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

"CPython"으로 알려진 가장 인기 있는 파이썬에서는 일반적으로 다음이 필요하지 않습니다.with파일이 완료되었음을 확인하고 파일을 닫아 줍니다.그러나 "Jython"(Java VM용 Python)이나 "PyPy"(Just-in-Time 코드 최적화 기능을 갖춘 멋진 실험 시스템)와 같은 다른 Python 구현에서는 파일을 닫지 못할 수도 있습니다.사용하는 습관을 들이는 것이 좋습니다.with코드를 이해하기 쉽게 만드는 것 같아요

Python 개체를 파일에 저장하려면 다음 모듈을 사용합니다.

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 절인 지만대신절인것하것▁pickled▁instead▁but인절신대.a합니다.b.

당신의 실수에 대해서:

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

self.whip사전 객체였습니다.deed.txt 텍트를포의내로때의 할 때deed.txt안으로self.whip,self.whip자체의 문자열 표현이 됩니다.

문자열을 다시 Python 객체로 평가하고 싶을 것입니다.

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

방법에목의 방법에 하십시오.eval 들립니다.evil그건 의도적인 것입니다.을 합니다.pickle대신 모듈을 사용합니다.

안녕하세요. 사전을 작성하고 파일로 읽는 방법이 있습니다. 사전을 JSON 형식으로 전환하고 빠르게 읽고 쓸 수 있습니다. 그냥 이렇게 하세요.

날짜를 쓰는 방법:

 import json

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

데이터 읽기:

 import json

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

나는 정말 잘 작동하는 나만의 기능을 만들었습니다.

def writeDict(dict, filename, sep):
    with open(filename, "a") as f:
        for i in dict.keys():            
            f.write(i + " " + sep.join([str(x) for x in dict[i]]) + "\n")

키 이름이 먼저 저장되고 그 다음에 모든 값이 저장됩니다.이 경우 내 딕트는 정수를 포함하므로 다음으로 변환됩니다.int이 부분이 당신의 상황에 맞게 변경해야 할 부분일 가능성이 높습니다.

def readDict(filename, sep):
    with open(filename, "r") as f:
        dict = {}
        for line in f:
            values = line.split(sep)
            dict[values[0]] = {int(x) for x in values[1:len(values)]}
        return(dict)

키-값 쌍을 반복하여 파일에 쓸 수 있습니다.

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

언급URL : https://stackoverflow.com/questions/11026959/writing-a-dict-to-txt-file-and-reading-it-back

반응형