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.txt
에 self.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')