Не могу прочитать добавленные данные с помощью метода pickle.load () - PullRequest
0 голосов
/ 24 октября 2010

Я написал два сценария Write.py и Read.py.

Write.py открывает friends.txt в режиме добавления и принимает данные для name, email, phone no, а затем создает дампсловарь в файл с использованием метода pickle.dump(), и все в этом сценарии работает нормально.

Read.py открывает friends.txt в режиме чтения, а затем загружает содержимое в словарь с использованием метода pickle.load() и отображаетсодержание словаря.

Основная проблема в Read.py скрипте, он показывает старые данные, он никогда не показывает добавленные данные?

Write.py

#!/usr/bin/python

import pickle

ans = "y"
friends={}
file = open("friends.txt", "a")
while ans == "y":
    name = raw_input("Enter name : ")
    email = raw_input("Enter email : ")
    phone = raw_input("Enter Phone no : ")

    friends[name] = {"Name": name, "Email": email, "Phone": phone}

    ans = raw_input("Do you want to add another record (y/n) ? :")

pickle.dump(friends, file)
file.close()

Read.py

#!/usr/bin/py

import pickle

file = open("friends.txt", "r")

friend = pickle.load(file)

file.close()

for person in friend:
    print friend[person]["Name"], "\t", friend[person]["Email"] , "\t", friend[person]["Phone"]

В чем должна быть проблема, кодвыглядит хорошо.Кто-нибудь может направить меня в правильном направлении?

Спасибо.

Ответы [ 2 ]

1 голос
/ 24 октября 2010

Вы должны загрузить из файла несколько раз.Каждый процесс записи игнорирует другие, поэтому он создает сплошной блок данных, независимый от других файлов.Если вы прочитаете его позже, он будет читать только один блок за раз.Так что вы можете попробовать:

import pickle

friend = {}
with open('friends.txt') as f:
    while 1:
        try:
            friend.update(pickle.load(f))
        except EOFError:
            break # no more data in the file

for person in friend.values():
    print '{Name}\t{Email}\t{Phone}'.format(**person)
1 голос
/ 24 октября 2010

Вы должны звонить pickle.load один раз для каждого звонка pickle.dump.Вы пишите рутина не добавляет запись в словарь, она добавляет другой словарь.Вам нужно будет вызывать pickle.load до тех пор, пока не будет прочитан весь файл, но это даст вам несколько словарей, которые вам придется объединить.Для этого проще всего хранить значения в CSV-формате.Это так же просто, как

with open("friends.txt", "a") as file:
    file.write("{0},{1},{2}\n".format(name, email, phone))

Чтобы загрузить значения в словарь, вы должны сделать:

with open("friends.txt", "a") as file:
    friends = dict((name, (name, email, phone)) for line in file for name, email, phone in line.split(","))
...