2014-12-21 3 views
-1

.txt 파일에 사전을 쓰려고 시도하는 중. 동일한 파일에서 다시 읽으려고합니다.Python : 파일에 사전 쓰기 및 읽기

book = {'key1':'1','key2':'2'} 

pfile = open("testfile.txt", "w+") 
pfile.write("%s" % book) 
pfile.close() 

k1 = book['key1'] 
k2 = book['key2'] 

print(k1) 
print(k2) 

rfile = open("testfile.txt", "r") 
rbook = rfile.read() 

k1 = rbook['key1'] 
k2 = rbook['key2'] 

print(k1) 
print(k2) 

을하지만 난이 평을 실행하려고 할 때 반환합니다 :

1 
2 
Traceback (most recent call last): File "sotest.py", line 16, in <module> 
    k1b = rbook['key1'] 
TypeError: string indices must be integers, not str 

을 나는 방법에 의해 맥에있어

내가 지금까지있어 무엇인가 .

내가 말했듯이, 나는 그 파일에 사전을 쓰고, 그 같은 파일에서 사전을 읽고 다시 인쇄하기를 원한다.

누군가 내가 뭘 잘못하고 있다고 말할 수 있습니까? 어쩌면이 코드를 어떻게 만들 수 있는지에 대한 예를 들어 주시겠습니까?

+0

[shelve] (https://docs.python.org/3/library/shelve.html)를 사용하고 있지 않습니다. – vaultah

+0

또는 [pickle] (https://docs.python.org/2/library/pickle.html). –

+0

오우, 오케이, 실제로 그 두 가지에 대해 읽었습니다. 코드 중 하나를 사용하는 방법에 대한 예를 들어 주시겠습니까? @abc – Viva

답변

1

파일에서 사전을 읽을 때 결과는 string이고 사전으로 밟아 볼 수 없습니다!

>>> ast.literal_eval("{'key1':'1','key2':'2'}") 
{'key2': '2', 'key1': '1'} 

을하지만,보다 효율적인 방법으로 당신이 shelf 모듈을 사용할 수 있습니다 : 당신이 사전에 변환 할 ast.literal_eval을 사용할 수 있습니다

A "선반"영구, 사전 같은 개체입니다. "dbm"데이터베이스와의 차이점은 선반에있는 값 (키가 아님)은 본질적으로 임의의 파이썬 객체 일 수 있다는 것입니다. 피클 모듈이 처리 할 수있는 모든 것입니다. 여기에는 대부분의 클래스 인스턴스, 재귀 데이터 형식 및 많은 공유 하위 개체가 포함 된 개체가 포함됩니다. 키는 일반 문자열입니다.

+0

고마워요! 선반을 더 자세히 살펴볼 것입니다! @Kasra – Viva

+0

@Viva 당신을 환영합니다! ;) – Kasramvd

0

당신은 정말 당신이 쓰는 (예)를 the pickle library을 사용할 수

import pickle 
pfile = open('filename.txt','wb')#binary mode for using pickle 
pickle.dump(mydict, pfile) 
pfile.close() 

또는 당신이 더 '파이썬'하고 싶은 경우에도 :

import pickle 
with open('filename.txt','wb') as pfile: 
    pickle.dump(mydict,pfile) 
0

가능성을 가질 수 pickle 사용 Python 코드는 피클로드시 실행될 수 있습니다. 악의적 인 사용자가 피클 파일을 일부 악성 코드로 교체 한 경우 문제가 발생합니다.

사전을 파일에 쓰는 데 Javascript Object Notation 또는 JSON을 사용할 것을 제안합니다. 파이썬에는 로딩과 덤핑 데이터를 제공 할 수있는 내장 된 json 모듈이있다. 아래의 코드는 사전으로이를 수행하는 장난감 예제입니다.

import json 

d = {'a':1, 'b':[0,1,2,3]} 

# j is now a string containing the data from d in the json format. 
j = json.dumps(d) 

with open('my_data.json', 'w') as f: 
    f.write(j) 

이제 데이터가 포함 된 my_data.json 파일을 갖게됩니다. dnew_d이 같은 정보가 포함됩니다

with open('my_data.json', 'r') as f: 
    new_d = json.loads(f.read()) 

, 그 후에 : 당신이하고자하는 경우 나중에 당신이 아래의 코드를 사용할 수 있습니다이에 다시 읽어보십시오.

print(d) 
print(new_d) 
# {'a': 1, 'b': [0, 1, 2, 3]} 
# {'a': 1, 'b': [0, 1, 2, 3]} 
+0

그래, JSON도 살펴볼 것이다. 감사! – Viva