2016-01-28 18 views
12

Tôi tạo ra một số dữ liệu và lưu trữ nó nhiều lần như thế này:Làm thế nào để đọc tệp dưa?

with open('filename', 'a') as f: 
     pickle.dump(data, f) 

Mỗi lần kích thước của tập tin tăng lên, nhưng khi tôi mở tập tin

with open('filename', 'rb') as f: 
    x = pickle.load(f) 

Tôi chỉ xem dữ liệu từ lần cuối cùng. Làm cách nào để đọc chính xác tệp?

+1

Bạn đang thêm các đối tượng vào tệp của mình. Khi bạn unpicke bạn unpickle chỉ mục đầu tiên. Bạn có chắc bạn cần tất cả những mục nhập đó không? Nếu không - thay đổi thành 'open ('filename', 'wb')' – Andrey

+0

Có, tôi cần tất cả các mục nhập. Kích thước của các tập tin cho thấy rằng nó chứa tất cả của nó. –

+1

Sau đó, @jsbueno là đúng trong câu trả lời của mình. – Andrey

Trả lời

21

Pickle tuần tự hóa một đối tượng tại một thời điểm và đọc lại một đối tượng - dữ liệu đã chọn được ghi theo thứ tự trên tệp.

Nếu bạn chỉ cần thực hiện pickle.load, bạn nên đọc đối tượng đầu tiên được tuần tự hóa vào tệp (không phải là đối tượng cuối cùng bạn đã viết).

Sau khi unserializing đối tượng đầu tiên, con trỏ tập tin là bắt đầu của đối tượng tiếp theo - nếu bạn chỉ cần gọi pickle.load một lần nữa, nó sẽ đọc đối tượng tiếp theo - làm điều đó cho đến khi kết thúc tệp.

objects = [] 
with (open("myfile", "rb")) as openfile: 
    while True: 
     try: 
      objects.append(pickle.load(openfile)) 
     except EOFError: 
      break 
-5

bạn không làm gì với nó, bạn chỉ tải tệp.

for line in x: 
    print x 

sẽ in mỗi dòng. (Trong câu thứ hai với tuyên bố)

2

Sau đây là ví dụ về cách bạn có thể viết và đọc tệp dưa chuột. Lưu ý rằng nếu bạn tiếp tục thêm dữ liệu dưa vào tệp, bạn sẽ cần phải tiếp tục đọc từ tệp cho đến khi bạn tìm thấy những gì bạn muốn hoặc một ngoại lệ được tạo bằng cách tiếp cận phần cuối của tệp. Đó là chức năng cuối cùng.

import os 
import pickle 


PICKLE_FILE = 'pickle.dat' 


def main(): 
    # append data to the pickle file 
    add_to_pickle(PICKLE_FILE, 123) 
    add_to_pickle(PICKLE_FILE, 'Hello') 
    add_to_pickle(PICKLE_FILE, None) 
    add_to_pickle(PICKLE_FILE, b'World') 
    add_to_pickle(PICKLE_FILE, 456.789) 
    # load & show all stored objects 
    for item in read_from_pickle(PICKLE_FILE): 
     print(repr(item)) 
    os.remove(PICKLE_FILE) 


def add_to_pickle(path, item): 
    with open(path, 'ab') as file: 
     pickle.dump(item, file, pickle.HIGHEST_PROTOCOL) 


def read_from_pickle(path): 
    with open(path, 'rb') as file: 
     try: 
      while True: 
       yield pickle.load(file) 
     except EOFError: 
      pass 


if __name__ == '__main__': 
    main() 
Các vấn đề liên quan