[python] txt 파일에 dict를 작성하고 다시 읽습니까?

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)



답변

귀하의 코드가 거의 맞습니다 ! 당신 말이 맞아요, 당신은 한 단계를 놓치고 있습니다. 파일을 읽을 때 문자열로 읽는 것입니다. 하지만 문자열을 다시 사전으로 바꾸고 싶습니다.

본 오류 메시지 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되며 라는 Python 모듈에서 가져옵니다 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”으로 알려진 가장 널리 사용되는 Python에서는 with기본 제공 “가비지 수집”기능이 파일 작업이 완료되었음을 파악하고 자동으로 닫을 것이므로 일반적으로 명령문이 필요하지 않습니다 . 그러나 “Jython”(자바 VM 용 Python) 또는 “PyPy”(Just-In-Time 코드 최적화 기능이있는 정말 멋진 실험 시스템)와 같은 다른 Python 구현은 파일을 닫을 수 없습니다. 를 사용하는 습관을들이는 것이 좋으며 with, 코드를 이해하기 쉽게 만든다고 생각합니다.


답변

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}


답변

Python 객체를 파일에 저장하려면 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하지 않고 대신 a파일로 피클 한 다음 b.

귀하의 오류 :

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

self.whip사전 개체였습니다. deed.txt텍스트가 포함되어 있습니다, 그래서 당신의 내용을로드 할 때 deed.txtself.whip, self.whip된다 문자열 자체의 표현입니다.

아마도 문자열을 파이썬 객체로 다시 평가하고 싶을 것입니다.

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

어떻게 eval들리는 지 주목하십시오 evil. 의도적입니다. pickle대신 모듈을 사용하십시오 .


답변

정말 잘 작동하는 내 함수를 만들었습니다.

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

먼저 키 이름을 저장 한 다음 모든 값을 저장합니다. 이 경우 내 dict에는 정수가 포함되어 있으므로 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)


답변

안녕하세요, 사전을 작성하고 파일로 읽는 방법이 있습니다. 사전을 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())


답변

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

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


답변